¿Hay alguna manera de hacer un "INSERTAR ... EN LA ACTUALIZACIÓN CLAVE DUPLICADA" en Zend Framework 1.5?
-
08-07-2019 - |
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 ...
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
}