使用 Eloquent ORM 执行 MYSQL 事务

Posted

技术标签:

【中文标题】使用 Eloquent ORM 执行 MYSQL 事务【英文标题】:Using Eloquent ORM to perform MYSQL transactions 【发布时间】:2018-01-29 01:12:50 【问题描述】:

几周前,我收到了一个关于库存/支付系统处理/处理的interesting inquiry,我决定实施公认答案的方法,因为它既最简单,也更有可能是最有效的给出的解决方案。

我将 Laravel 的 Eloquent ORM 与 Slim Framework 结合使用,并且我想执行一个 mysql transaction,其中包含有关库存系统中物品库存减少的特定查询。我想使用transaction 的代码如下:

    // decrement each items stock following successful payment
    try 
      // here is where i'd like to perform a transaction, rather than simple eloquent query
         foreach ($this->c->basket->all() as $product) 
            $product->decrement('stock', $product->quantity);
        
     catch (Exception $e) 

        // if error is caused during decremention of item(s),
        // handle accordingly 

    

现在我正在使用前面提到的 Slim,我相信我没有对 Laravel DB Facade 的本地访问权限,据我所知处理事务。

建议?

旁注

我的数据库连接在 initialization 文件中全局设置,如下所示:

$capsule = new Illuminate\Database\Capsule\Manager();

$capsule->addConnection($container['settings']['db']);

$capsule->setAsGlobal();

$capsule->bootEloquent();

【问题讨论】:

【参考方案1】:

您可以从 slim 容器中获取 Capsule 对象,然后只需使用 Connection 对象来启动和提交数据库事务。如果发生异常,只需调用rollBack() 方法即可。

伪代码:

$capsule = new \Illuminate\Database\Capsule\Manager();

// Get a registered connection instance.
$connection = $capsule->getConnection();

// begin a transaction manually
$connection->beginTransaction();

try 
    // do something...
    $product->decrement('stock', $product->quantity);

    // commit a transaction via the commit method
    $connection->commit();
 catch (Exception $e) 
    // you can rollback the transaction via the rollBack method
    $connection->rollBack();

【讨论】:

所以假设我可以在try catch 语句的try 块中执行上述逻辑,在catch 块中,我如何从事务中获取任何异常?

以上是关于使用 Eloquent ORM 执行 MYSQL 事务的主要内容,如果未能解决你的问题,请参考以下文章

Laravel Eloquent ORM 事务

如何在 eloquent ORM 中执行此搜索查询

在 Laravel 中使用 Eloquent ORM 使用 LIKE 执行数据库搜索

Laravel:使用 Query Builder 或 Eloquent ORM 时在每次插入/更新时执行一些任务

我想将 MySQL 查询转换为 Laravel Eloquent / Laravel ORM

Mysql 视图 - 自动增量不起作用(通过 Eloquent ORM)