2011-09-03 6 views
1

Magento에서 트랜잭션을 사용하고 있습니다. 모든 후속 쿼리에 첫 번째 삽입 쿼리의 primeryKey를 사용해야합니다.Magento는 트랜잭션 중간에 마지막으로 삽입 된 ID입니다.


    $model1->setfield1() 
      ->setField2(); 
    $transaction->addObject($model1); 
    $connection = Mage::getSingleton('core/resource')->getConnection('core_read'); 
    $lastInsertId = $connection->fetchOne('SELECT last_insert_id()'); // return 0 
    $model2->setfield3($lastInsertId) 
    $model3->setfield4($lastInsertId) 
    $transaction->addObject($model2); 
    $transaction->addObject($model3); 

    $transaction-Save(); 
    $lastInsertId2 = $connection->fetchOne('SELECT last_insert_id()'); // returns correct result 

마지막 얻을 트랜잭션이 Tyy

답변

2

트랜잭션이 커밋되지 않은 동안 PDO (magento가 사용하는)는 last_inserted_id를 얻을 수 없다고 생각합니다. 나는 당신이 평범한 SQL을 there과 같이 시도하거나 중첩 된 트랜잭션을 사용해보아야한다고 생각한다.

+0

Magento에서 중첩 트랜잭션을 어떻게 사용할 수 있습니까? – sushantsahay

1

저장하기 전에 ID를 삽입하는 방법 : $ lastInsertId = $ 연결 -> lastInsertId를();

+0

안녕하세요 Sudhir, 트랜잭션을 저장하기 전에 호출하면 0이 반환됩니다. 내 코드가 반환하는 것처럼 트랜잭션 저장 후 올바른 결과를 반환합니다. – sushantsahay

0

거래의 경우에 대해 확실하지,하지만 난 보통 이런 식으로 작업을 수행합니다

$data = $this->getRequest()->getPost(); 
$list = Mage::getModel('myextension/list')->setData($data); 
$list->setUserId($userId) 
    ->setCreatedTime(now()); 

try 
{ 
$list->save(); 
} 
catch(Exception $e) 
{ 
Mage::getSingleton('core/session')->addError($e->getMessage()); 
return $this->_redirect('*/*/'); 
} 

$last_insert_id = $list->getId(); 
당신이 save() 메서드를 호출 할 때까지 DB에서 데이터를 변경하지 않습니다
0

젠토 거래 :

$transaction->addObject($model1); 
... 
$transaction->save(); 

addObject()을 트랜잭션의 레지스트리 (\Mage_Core_Model_Resource_Transaction::$_objects)에 새로운 객체를 추가하기 만하면됩니다. $model1->save() 메서드는 $transaction->save()에서 호출됩니다. No 삽입 작업은 $transaction->save() 호출 전에 수행됩니다.

관련 문제