使用 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 使用 LIKE 执行数据库搜索
Laravel:使用 Query Builder 或 Eloquent ORM 时在每次插入/更新时执行一些任务