Magento 在事务中间最后插入 id

Posted

技术标签:

【中文标题】Magento 在事务中间最后插入 id【英文标题】:Magento last insert id in middle of transaction 【发布时间】:2011-09-03 11:04:01 【问题描述】:

我在 Magento 中使用事务。 我需要对所有后续查询使用第一个插入查询的primeryKey。


    $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

如何在保存交易前获取最后插入的 id

【问题讨论】:

【参考方案1】:

我猜 PDO(magento 使用的)在尚未提交事务时无法获取 last_inserted_id。我想你应该尝试像there 这样的普通sql,或者尝试使用嵌套事务。

【讨论】:

如何在 Magento 中使用嵌套事务?【参考方案2】:

Tyy 这个: $lastInsertId = $connection->lastInsertId();

【讨论】:

嗨 Sudhir,在保存事务之前调用它返回 0,就像我的代码正在返回一样,在保存事务后调用它返回正确的结果。【参考方案3】:

不确定交易的情况,但我通常这样做:

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

【讨论】:

【参考方案4】:

在您调用save() 方法之前,Magento 事务不会更改数据库中的数据:

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

addObject() 只是将新对象添加到事务的注册表 (\Mage_Core_Model_Resource_Transaction::$_objects)。 $model1->save() 方法将在 $transaction->save() 上调用。在$transaction->save() 调用之前不执行INSERT 操作。

【讨论】:

以上是关于Magento 在事务中间最后插入 id的主要内容,如果未能解决你的问题,请参考以下文章

如何从 JayData 事务中获取最后插入 ID?

如何使用 DAO 检测 Yii 中事务中的最后一个插入 ID?

Magento:在Magento模板中插入静态块

Magento。将块插入另一个而不更改模板代码

Oracle自治事务实际用例

Magento : 缺货产品在类别页面中显示在最后