48 votes

Est-il un moyen de faire un "INSERT...SUR une CLÉ en DOUBLE UDPATE" dans le Zend Framework?

Je voudrais utiliser ON DUPLICATE KEY UPDATE dans le Zend Framework, est-ce possible?

Exemple

INSERT INTO sometable (...)
VALUES (...)
ON DUPLICATE KEY UPDATE ...

54voto

Bill Karwin Points 204877

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");

6voto

todofixthis Points 4206

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.

5voto

Sergei Morozov Points 334

@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';

4voto

Pawel Cz. Points 46
$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)));
    }

}

1voto

Rajdeep Rath Points 27

Utilisez ceci à la place:

REPLACE INTO sometable SET field ='value'.....

Ceci mettra à jour si elle existe ou il suffit de l'insérer dans le cas contraire. C'est une partie de la norme api mysql.

Prograide.com

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.

Powered by:

X