Zend Framework 1.5에서 "삽입… 중복 키 업데이트"를 수행하는 방법이 있습니까?
-
08-07-2019 - |
문제
사용하고 싶습니다 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
}