首页 文章

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

提问于
浏览
0

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

我在一个问两个问题(因为它紧密耦合)

使用:Laravel 5.5和Mysql

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

我正在尝试删除 User ,它具有以下关系

belongsTo Address ,belongsTo Package ,hasMany Orders ,hasMany Comments

UserPost 被删除时 Orders cascade _1358664_或 Product 被删除 COmments cascade

现在如何删除 User 并自动关联 orderscomments 已删除?

当我尝试删除 $user->delete() laravel抛出异常时:

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)

所以我决定使用一个事务来删除,用户,关联的订单和评论,以确保删除所有内容 .

但我没有在eloquent中找到任何事务,而是在查询构建器(DB)中 .

2.如果我使用来自DB的交易并使用eloquent来删除用户($ user-> delete),这会被视为交易吗?

喜欢:

DB::transaction(function() {

      $user->comments->delete();
      $user->orders->delete();
      $user->delete();
});

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

任何帮助将不胜感激

2 回答

  • 2
    • 您有Eloquent events用于删除,但您也可以覆盖默认删除方法,如下所示:
    public function delete()
    {
        \DB::transaction(function() {
            $this->comments()->delete();
            $this->orders()->delete();
            parent::delete(); 
         });
    }
    
    • 是的,Eloquent本身没有交易 . 您在显示时使用事务并在其中包装Eloquent或查询构建器 . 请注意,在您的情况下,您应该使用 comments()orders() 而不是 commentsorders
  • 1

    @Marcin

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

    例如:$ this-> orders() - > delete(); - 这一行实际上并没有加载Order模型 - $ this-> orders() - 返回一个Query Object - 这一行实际上会运行一个DELETE SQL语句

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

    当user :: deletion事件启动时,加载用户的所有命令并调用delete;这将触发命令::删除事件,我们将加载所有注释对象并删除它们

相关问题