Gibt es eine Möglichkeit, eine „INSERT ... ON DUPLICATE KEY UPDATE“ in Zend Framework 1.5 zu tun?
-
08-07-2019 - |
Frage
Ich mag ON DUPLICATE KEY UPDATE
in Zend Framework 1.5 verwenden, ist das möglich?
Beispiel
INSERT INTO sometable (...)
VALUES (...)
ON DUPLICATE KEY UPDATE ...
Lösung
Ich arbeitete für Zend und arbeitete speziell auf Zend_Db eine ganze Menge.
Nein, es gibt keine API-Unterstützung für die ON DUPLICATE KEY UPDATE
Syntax. Für diesen Fall müssen Sie einfach query()
verwenden und die vollständige SQL-Anweisung selbst bilden.
Ich empfehle keine Werte in die SQL-Interpolations-als harvejs zeigt. Verwenden Sie Abfrageparameter.
Edit:. Sie können vermeiden, dass die Parameter Wiederholung von VALUES()
Ausdrücke mit
$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");
Andere Tipps
Als Sidebar können Sie die ON DUPLICATE KEY UPDATE
Klausel vereinfachen und die Menge der Verarbeitung Skript reduzieren muss mithilfe von VALUES()
tun:
$sql = 'INSERT INTO ... ON DUPLICATE KEY UPDATE id = VALUES(id), col2 = VALUES(col2), col3 = VALUES(col3)';
Siehe http: //dev.mysql. com / doc / refman / 5.1 / de / Insert-on-duplicate.html für weitere Informationen.
@ Bill Karwin: große Lösungen! Aber es wäre größer, wenn benannte Platzhalter zu verwenden ( „: id“, „: col1“, ...) statt Fragen Zeichen. Als Sie von array_marge Werte duplizieren wouldn'n benötigen. wenn auch die Verwendung von „SET“ Syntax „INSERT“ anstelle von „Werten“, wird der Code simplier automatisch für jede Gruppe von Feldern erzeugt werden.
$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)));
}
}
Verwendung:
zB. 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);
}
}
Verwenden Sie stattdessen:
REPLACE INTO sometable SET field ='value'.....
Dies wird aktualisiert, wenn vorhanden ist oder nur ein, wenn es nicht. Dies ist ein Teil des Standard-mysql api.
Sie können einfach etwas tun:
gesetzt eindeutiger Index auf id
und dann
try {
do insert here
} catch (Exception $e) {
do update here
}