¿Hay alguna manera de hacer un "INSERTAR ... EN LA ACTUALIZACIÓN CLAVE DUPLICADA" en Zend Framework 1.5?

StackOverflow https://stackoverflow.com/questions/302544

Pregunta

Me gustaría usar EN LA ACTUALIZACIÓN DE CLAVE DUPLICADA en Zend Framework 1.5, ¿es esto posible?

Ejemplo

INSERT INTO sometable (...)
VALUES (...)
ON DUPLICATE KEY UPDATE ...
¿Fue útil?

Solución

Trabajé para Zend y específicamente trabajé bastante en Zend_Db.

No, no hay soporte API para la sintaxis ON DUPLICATE KEY UPDATE . Para este caso, simplemente debe usar query () y formar la declaración SQL completa usted mismo.

No recomiendo interpolar valores en el SQL como muestra harvejs. Usar parámetros de consulta.

Editar: puede evitar repetir los parámetros utilizando expresiones VALUES () .

$sql = "INSERT INTO sometable (id, col2, col3) VALUES (:id, :col2, :col3)
  ON DUPLICATE KEY UPDATE col2 = VALUES(col2), col3 = VALUES(col3)";

$values = array("id"=>1, "col2"=>327, "col3"=>"active");

Otros consejos

Como barra lateral, puede simplificar la cláusula ON DUPLICATE KEY UPDATE y reducir la cantidad de procesamiento que debe realizar su script utilizando VALUES () :

$sql = 'INSERT INTO ... ON DUPLICATE KEY UPDATE id = VALUES(id), col2 = VALUES(col2), col3 = VALUES(col3)';

Consulte http: //dev.mysql. com / doc / refman / 5.1 / es / insert-on-duplicate.html para obtener más información.

@Bill Karwin: ¡excelentes soluciones! Pero sería mejor usar marcadores de posición con nombre (": id " ;, ": col1 " ;, & # 8230;) en lugar de signos de preguntas. De lo que no necesitaría duplicar valores mediante array_marge. También si usar " SET " sintaxis de "INSERTAR" en lugar de " VALUES " ;, el código se vuelve más fácil de generar automáticamente para cualquier conjunto de campos.

$sql = 'INSERT INTO sometable SET id = :id, col2 = :col2, col3 = :col3
    ON DUPLICATE KEY UPDATE id = :id, col2 = :col2, col3 = :col3';
$arrayData = array('column1' => value1, 'column2' => value2, ...)

class Model_Db_Abstract extends Zend_Db_Table_Abstract
{
    protected 
class Model_Db_Contractors extends Model_Db_Abstract 
{

    protected 
$arrayData = array('column1' => value1, 'column2' => value2, ...)

class Model_Db_Abstract extends Zend_Db_Table_Abstract
{
    protected 
class IndexController extends Zend_Controller_Action
{
 public function saveAction()
 {
  $contractorModel = new Model_Db_Contractors();
  $aPost = $this->getRequest()->getPost();

  /* some filtering, checking, etc */

  $contractorModel->insertOrUpdate($aPost);
 }
}

USAGE:

ej. Model_Db_Contractors.php

<*>

IndexController.php

<*>name; protected <*>

USAGE:

ej. Model_Db_Contractors.php

<*>

IndexController.php

<*>primaryKey; public function insertOrUpdate($arrayData) { $query = 'INSERT INTO `'. $this->_name.'` ('.implode(',',array_keys($arrayData)).') VALUES ('.implode(',',array_fill(1, count($arrayData), '?')).') ON DUPLICATE KEY UPDATE '.implode(' = ?,',array_keys($arrayData)).' = ?'; return $this->getAdapter()->query($query,array_merge(array_values($arrayData),array_values($arrayData))); } }

USAGE:

ej. Model_Db_Contractors.php

<*>

IndexController.php

<*>name = 'contractors'; protected
$arrayData = array('column1' => value1, 'column2' => value2, ...)

class Model_Db_Abstract extends Zend_Db_Table_Abstract
{
    protected <*>

USAGE:

ej. Model_Db_Contractors.php

<*>

IndexController.php

<*>name; protected <*>

USAGE:

ej. Model_Db_Contractors.php

<*>

IndexController.php

<*>primaryKey; public function insertOrUpdate($arrayData) { $query = 'INSERT INTO `'. $this->_name.'` ('.implode(',',array_keys($arrayData)).') VALUES ('.implode(',',array_fill(1, count($arrayData), '?')).') ON DUPLICATE KEY UPDATE '.implode(' = ?,',array_keys($arrayData)).' = ?'; return $this->getAdapter()->query($query,array_merge(array_values($arrayData),array_values($arrayData))); } }

USAGE:

ej. Model_Db_Contractors.php

<*>

IndexController.php

<*>primaryKey = 'contractor_id'; ... }

USAGE:

ej. Model_Db_Contractors.php

<*>

IndexController.php

<*>name; protected <*>

USAGE:

ej. Model_Db_Contractors.php

<*>

IndexController.php

<*>primaryKey; public function insertOrUpdate($arrayData) { $query = 'INSERT INTO `'. $this->_name.'` ('.implode(',',array_keys($arrayData)).') VALUES ('.implode(',',array_fill(1, count($arrayData), '?')).') ON DUPLICATE KEY UPDATE '.implode(' = ?,',array_keys($arrayData)).' = ?'; return $this->getAdapter()->query($query,array_merge(array_values($arrayData),array_values($arrayData))); } }

USAGE:

ej. Model_Db_Contractors.php

<*>

IndexController.php

<*>

Use esto en su lugar:

REPLACE INTO sometable SET field ='value'.....

Esto se actualizará si existe o simplemente se insertará si no. Esto es parte de la API estándar de MySQL.

simplemente puedes hacer algo como esto:

establezca un índice único en su identificación

y luego

try {
   do insert here
} catch (Exception $e) {
   do update here
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top