هل هناك طريقة للقيام بـ "INSERT...ON DUPLICATE KEY UPDATE" في Zend Framework 1.5؟

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

سؤال

أود أن استخدام ON DUPLICATE KEY UPDATE في Zend Framework 1.5، هل هذا ممكن؟

مثال

INSERT INTO sometable (...)
VALUES (...)
ON DUPLICATE KEY UPDATE ...
هل كانت مفيدة؟

المحلول

وعملت لزند، وعملت بشكل خاص على Zend_Db قليلا جدا.

لا، لا يوجد أي دعم API لبناء الجملة ON DUPLICATE KEY UPDATE. لهذه الحالة، يجب عليك ببساطة استخدام query() وتشكيل بيان SQL كاملة نفسك.

وأنا لا أنصح التحريف القيم في SQL كما harvejs العروض. استخدام معلمات الاستعلام.

وتحرير: يمكنك تجنب تكرار المعلمات باستخدام تعبيرات 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");

نصائح أخرى

وأما الشريط الجانبي، يمكنك تبسيط شرط ON DUPLICATE KEY UPDATE وتقليل كمية من تجهيز السيناريو الخاص بك يحتاج إلى القيام به باستخدام VALUES():

$sql = 'INSERT INTO ... ON DUPLICATE KEY UPDATE id = VALUES(id), col2 = VALUES(col2), col3 = VALUES(col3)';

HTTP: //dev.mysql. كوم / وثيقة / RefMan معلومات / 5.1 / EN / إدراج على اساس duplicate.html للحصول على مزيد من المعلومات.

وBill Karwin: حلول كبيرة! ولكن سيكون أكبر إذا لاستخدام العناصر النائبة اسمه ( ": معرف"، ": COL1"، ...) بدلا من الأسئلة علامات. مما كنت wouldn'n تحتاج إلى تكرار القيم التي كتبها array_marge. أيضا إذا كان لاستخدام "SET" بناء جملة "إدراج" بدلا من "القيم"، رمز يحصل على أبسط أن تتولد تلقائيا لأي مجموعة من المجالات.

$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)));
    }

}

الاستخدام:

على سبيل المثال.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);
 }
}

استخدم هذا بدلا من ذلك:

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

وسيتم تحديث هذا إن وجدت أو إدراج فقط إن لم يكن. هذا هو جزء من المعهد الخلية القياسية.

ويمكنك ببساطة أن تفعل شيئا من هذا القبيل:

ووضع فهرس فريد على الهوية الخاصة بك

ثم

try {
   do insert here
} catch (Exception $e) {
   do update here
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top