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에서 일했고 구체적으로 Zend_db에서 상당히 일했습니다.

아니요, API 지원은 없습니다 ON DUPLICATE KEY UPDATE 통사론. 이 경우 간단히 사용해야합니다 query() 완전한 SQL 문을 직접 형성하십시오.

Harvejs가 보여주는 것처럼 값을 SQL에 보간하는 것이 좋습니다. 쿼리 매개 변수를 사용하십시오.

편집 : 사용하여 매개 변수를 반복하지 않을 수 있습니다. 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.com/doc/refman/5.1/en/insert-on-duplice.html 자세한 내용은.

@Bill Karwin : 훌륭한 솔루션! 그러나 질문 표시 대신 지명 된 자리 표시 자 ( ": id", ": col1",…)를 사용하는 것이 더 커질 것입니다. Array_Marge에 의해 값을 복제 할 필요가없는 것보다. 또한 "값"대신 "삽입"의 "세트"구문을 사용하는 경우 코드는 모든 필드 세트에 대해 자동으로 단순화되게됩니다.

$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'.....

이것은 존재하는 경우 업데이트되거나 그렇지 않은 경우 삽입합니다. 이것은 표준 MySQL API의 일부입니다.

당신은 단순히 다음과 같은 일을 할 수 있습니다.

ID에서 고유 인덱스를 설정하십시오

그리고

try {
   do insert here
} catch (Exception $e) {
   do update here
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top