Cakephp 3对多个模型操作的事务管理

时间:2015-10-31 19:45:13

标签: php cakephp transactions cakephp-3.0

我有一个代码块,可以完成多个表数据库操作。我需要在事务中保留此代码块。我想在cakephp 3中尝试以下方式。

    $saveStatus = 1;
    $conn = ConnectionManager::get('default');
    $conn->begin();
    $tableArticles = TableRegistry::get('Articles');
    $tableUsers = TableRegistry::get('Users');
    $articlesEntity = $tableArticles->newEntities($categoriesArray);
    foreach ($articlesEntity as $entity) {          
        if(!$tableArticles->save($entity))
        {
            $saveStatus = 0;
        }
    }
    $usersEntity = $tableUsers->newEntities($usersArray);
    foreach ($usersEntity as $entity) {
        if(!$tableUsers->save($entity))
        {
            $saveStatus = 0;
        }
    }
    if($saveStatus ==1)
    {
        $conn->commit();

    }
    else
    {
        $conn->rollback();         

    }

但该事务仅适用于一个表。我希望多个表操作应该在事务中。

在蛋糕2中,我们使用begin()和commit()对每个模型数据源执行事务,如下所示。

   $mealOptionDataSource = $this->MealOptionFood->getDataSource ();
    $foodExtrasDataSource = $this->FoodExtras->getDataSource ();
    $complexOptionDataSource = $this->ComplexOptionFood->getDataSource ();

    $mealOptionDataSource->begin ();
    $foodExtrasDataSource->begin ();
    --- Code here---
    $mealOptionDataSource->commit ();
    $foodExtrasDataSource->commit ();
    $complexOptionDataSource->commit ();

我无法找到如何在蛋糕3中做到这一点的方法。

感谢进步。

1 个答案:

答案 0 :(得分:0)

试试这个: http://api.cakephp.org/3.1/class-Cake.Database.Connection.html#_transactional



$connection->transactional(function ($connection) {
  $connection->newQuery()->delete('users')->execute();
});




在交易功能中,'提交'或者'回滚'根据内部所有查询的结果自动发生。