DB :: transaction()可以执行Eloquent查询作为事务吗?

时间:2017-11-10 14:01:14

标签: php laravel transactions eloquent laravel-5.5

我:这是一个混合问题| 访客:( wtf?)这意味着什么?

我在一个问题中提出两个问题(紧密耦合)

使用:Laravel 5.5& MySQL的

1。如何在eloquent中删除相关模型?

我试图删除具有以下关系的User

belongsTo Address, belongsTo Package, hasMany Orders, hasMany Comments

删除OrdersUser

Product级联 <{1}}或COmments被删除时User级联。

现在如何删除Post&amp;自动关联User&amp; orders已删除?

当我尝试删除comments laravel抛出异常时:

$user->delete()

所以我决定使用一个交易删除,用户,关联的订单和评论, 确保删除所有内容。

但我没有在eloquent中找到任何事务但在查询构建器(DB)中找不到。

2。如果我使用来自DB&amp;的交易使用eloquent删除用户(SQLSTATE[23000]: Integrity constraint violation: 1451 Cannot delete or update a parent row: a foreign key constraint fails (`cybertron`.`comments`, CONSTRAINT `comments_user_id_foreign` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`)) (SQL: delete from `users` where `id` = 4) )这会被视为交易吗?

像:

$user->delete

如果没有,那么我如何与Eloquent进行交易?

非常感谢任何帮助

2 个答案:

答案 0 :(得分:2)

  1. 您有Eloquent events对于删除,但您也可以覆盖默认删除方法,如下所示:

    public function delete()
    {
        \DB::transaction(function() {
            $this->comments()->delete();
            $this->orders()->delete();
            parent::delete(); 
         });
    }
    
  2. 是的,Eloquent本身没有交易。您在显示时使用事务并在其中包装Eloquent或查询构建器。请注意,在您的情况下,您应该使用comments()orders()代替commentsorders

答案 1 :(得分:1)

@Marcin

如果要在模型上使用事件,则为了级联删除,需要确保您了解在Query对象上运行删除与在Model对象上运行删除之间的区别

例如: $ this-> orders()-> delete();  -该行实际上未加载订单模型  -$ this-> orders()-返回查询对象  -此行实际上将运行DELETE SQL语句

为了在删除用户时按顺序启动删除事件,您必须进行一次foreach foreach($ user-> orders as $ order)$ order-> delete();

启动user :: deleting事件时,加载用户的所有订单并调用delete; 这将触发order :: deleting事件,在该事件中,我们将加载所有注释对象并也将其删除