Gibt es eine Möglichkeit, eine „INSERT ... ON DUPLICATE KEY UPDATE“ in Zend Framework 1.5 zu tun?

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

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 ...
War es hilfreich?

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
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top