Je voudrais utiliser ON DUPLICATE KEY UPDATE
dans le Zend Framework, est-ce possible?
Exemple
INSERT INTO sometable (...)
VALUES (...)
ON DUPLICATE KEY UPDATE ...
Je voudrais utiliser ON DUPLICATE KEY UPDATE
dans le Zend Framework, est-ce possible?
Exemple
INSERT INTO sometable (...)
VALUES (...)
ON DUPLICATE KEY UPDATE ...
J'ai travaillé pour Zend et spécifiquement travaillé sur Zend_Db un peu.
Non, il n'y a pas de prise en charge des API pour l' ON DUPLICATE KEY UPDATE
de la syntaxe. Dans ce cas, vous devez simplement utiliser query()
et de la forme de l'instruction SQL complète de vous-même.
Je ne recommande pas l'interpolation des valeurs dans le SQL comme harvejs montre. Utilisez les paramètres de requête.
Edit: Vous pouvez éviter de répéter les paramètres à l'aide d' VALUES()
expressions.
$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");
La barre latérale, vous pouvez simplifier l' ON DUPLICATE KEY UPDATE
de la clause et de réduire la quantité de traitement de votre script doit s'effectuer à l'aide de VALUES()
:
$sql = 'INSERT INTO ... ON DUPLICATE KEY UPDATE id = VALUES(id), col2 = VALUES(col2), col3 = VALUES(col3)';
Voir http://dev.mysql.com/doc/refman/5.1/en/insert-on-duplicate.html pour plus d'informations.
@Bill Karwin: d'excellentes solutions! Mais il serait plus grande si l'utilisation de marqueurs nommés (":id", ":col1", ...) au lieu de les questions des signes. Que vous ne'n besoin de dupliquer les valeurs par array_marge. Aussi, si utiliser "le JEU" la syntaxe de la commande "INSÉRER" au lieu de "VALEURS", le code est plus simple d'être générées automatiquement pour n'importe quel ensemble de champs.
$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 $_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)));
}
}
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.