php - ¿Hay alguna manera de hacer un "INSERTAR... SOBRE ACTUALIZACIÓN DUPLICADA DE LLAVE" en Zend Framework 1.5?
mysql zend-framework (6)
@Bill Karwin: ¡excelentes soluciones! Pero sería mejor si usara marcadores de posición con nombre (": id", ": col1", ...) en lugar de signos de pregunta. De lo que no necesitarías duplicar valores por array_marge. Además, si se usa la sintaxis "SET" de "INSERT" en lugar de "VALUES", el código se simplificará para que se genere 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'';
Me gustaría utilizar ON DUPLICATE KEY UPDATE
en Zend Framework 1.5, ¿es esto posible?
Ejemplo
INSERT INTO sometable (...)
VALUES (...)
ON DUPLICATE KEY UPDATE ...
Como barra lateral, puede simplificar la cláusula ON DUPLICATE KEY UPDATE
y reducir la cantidad de procesamiento que su script necesita hacer mediante el uso de 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/en/insert-on-duplicate.html para obtener más información.
Trabajé para Zend y específicamente trabajé bastante en Zend_Db.
No, no hay soporte de 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 lo muestra harvejs. Use los parámetros de consulta.
Editar: puede evitar repetir los parámetros usando 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");
Use esto en su lugar:
REPLACE INTO sometable SET field =''value''.....
Esto se actualizará si existe o simplemente inserte si no. Esta es una parte de la API estándar de MySQL.
simplemente puedes hacer algo como esto:
establecer índice único en su identificación
y entonces
try {
do insert here
} catch (Exception $e) {
do update here
}
$arrayData = array(''column1'' => value1, ''column2'' => value2, ...)
class Model_Db_Abstract extends Zend_Db_Table_Abstract
{
protected $_name;
protected $_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)));
}
}
USO:
p.ej. Model_Db_Contractors.php
class Model_Db_Contractors extends Model_Db_Abstract
{
protected $_name = ''contractors'';
protected $_primaryKey = ''contractor_id'';
...
}
IndexController.php
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);
}
}