IT

"INSERT..."를 하는 방법이 있습니까?Zend Framework 1.5의 중복 키 업데이트"에 대해 설명합니다.

itgroup 2022. 11. 18. 21:36
반응형

"INSERT..."를 하는 방법이 있습니까?Zend Framework 1.5의 중복 키 업데이트"에 대해 설명합니다.

사용하고 싶다ON DUPLICATE KEY UPDATEZend 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-duplicate.html 를 참조해 주세요.

@Bill Karwin: 훌륭한 솔루션!단, 물음표 대신 명명된 플레이스 홀더(":id", ":col1" 등)를 사용하는 것이 좋습니다.array_marge에서 값을 복제할 필요가 없습니다.또한 "VALUES" 대신 "INSERT"의 "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';

    ...
}

Index Controller(인덱스 컨트롤러)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의 일부입니다.

Pawel's Answer로 업데이트하여 별도의 삽입 및 업데이트 데이터를 지원하고 Zend DB Expressions도 지원합니다.

  class Model_Db_Abstract extends Zend_Db_Table_Abstract
    {
        protected $_name;
        protected $_primaryKey;

        public function insertOrUpdate($arrayData)
        {
            $insertDataValuesForQuery = [];
            $queryParams = [];
            foreach ($insertData as $key => $value) {
                if (gettype($value) == "object") {
                    array_push($insertDataValuesForQuery, $value->__toString());
                    continue;
                }
                array_push($insertDataValuesForQuery, "?");
                array_push($queryParams, $value);
            }

            $updateDataValuesForQuery = [];
            foreach ($updateData as $key => $value) {
                if (gettype($value) == "object") {
                    array_push($updateDataValuesForQuery, $key . " = " . $value->__toString());
                    continue;
                }
                array_push($updateDataValuesForQuery, $key . " = ?");
                array_push($queryParams, $value);
            }

            $query = 'INSERT INTO ' . $this->_name . ' (' . implode(',', array_keys($insertData)) . ') VALUES (' . implode(',', $insertDataValuesForQuery) . ') ON DUPLICATE KEY UPDATE ' . implode(' , ', $updateDataValuesForQuery);
            return $this->getAdapter()->query($query, $queryParams);
     }
}

간단하게 다음과 같은 작업을 수행할 수 있습니다.

ID에 고유 색인 설정

그리고 나서.

try {
   do insert here
} catch (Exception $e) {
   do update here
}

언급URL : https://stackoverflow.com/questions/302544/is-there-a-way-to-do-an-insert-on-duplicate-key-update-in-zend-framework-1-5

반응형