在 Laravel 查询生成器中删除不同表中链接的多个记录的最佳方法

Posted

技术标签:

【中文标题】在 Laravel 查询生成器中删除不同表中链接的多个记录的最佳方法【英文标题】:Best way of deleting multiple records linked in different tables in Laravel query builder 【发布时间】:2021-05-23 18:06:05 【问题描述】:

我的 Laravel 8 API 中有一个函数可以删除用户的帐户,它还会删除任何其他表中的任何数据,其中他们的user_id 与被删除的帐户匹配。一件事情很快就变得显而易见了,那就是如何扩展它,以及是否有更好、可能更快、更可靠的方法来删除链接表数据。

另一方面,我这样做的方式是否适合中型 Web 应用程序,我当前的代码是:

/**
 * Delete account
 *
 * @return Response
 */
public function deleteAccount(Request $request)


    // attempt to delete account
    try 

        $id = Auth::user();
        $user = User::findOrFail($id['id']);
        $user->delete();

        $items1 = MyFirstModel::where('user_id', $id['id'])->get();
        if (count($items1) > 0) 
          foreach ($items1 as $key => $item) 
            $item->delete();
          
        

        $items2 = MySecondModel::where('user_id', $id['id'])->get();
        if (count($items2) > 0) 
          foreach ($items2 as $key => $item) 
            $item->delete();
          
        

        // ... other models here.

        // everything went okay!
        return response()->json(['success' => true, 'message' => 'Your account has been deleted'], 200);

     catch (Exception $e) 

        // catch the error
        return response()->json(['success' => false, 'message' => 'We was unable to delete your account at this time'], 422);

    


【问题讨论】:

【参考方案1】:

您可以挂钩Model 生命周期事件。在您的示例中,您希望在删除 Model 时删除相关数据。因此,在您的 Model 上,执行以下操作:

public function booted()

    static::deleted(function ($model) 
        $model->releationship()->delete();
    )

您可以阅读有关model lifecycle events on the docs 的更多信息。

【讨论】:

这很可靠吧?这到底是如何工作的? 只是对此的观察,在将其添加到我的 User 模型后,我现在实际上无法创建帐户,我在尝试创建帐户时收到 Call to undefined method App\\Models\\User::releationship() 作为 422 错误跨度> @RyanH 您正在用您的实际关系替换relationship(),对吧?【参考方案2】:

如果您的数据库使用外键并且外键使用 CASCADE DELETE。删除用户时会删除所有引用。 请记住,不应该总是这样做。例如,当您将订单链接到用户时。

【讨论】:

我的其他表中的user_id 列或等值列(不是ID)存储为$table->integer('user_id')->unsigned()->nullable()->index();,所以这种方法仍然有效吗? 不,遗憾的是没有。唯一的方法是手动删除记录。或者通过将所有这些字段转换为外键。然后您可以删除用户,所有其他记录也将被删除 并非所有引擎都支持外键的 ON DELETE CASCADE 操作。我不认为 MyISAM 支持它,而 INNODB 支持它。

以上是关于在 Laravel 查询生成器中删除不同表中链接的多个记录的最佳方法的主要内容,如果未能解决你的问题,请参考以下文章

如何在 laravel 中使用查询生成器根据 id 从多个表中获取数据

使用 laravel 查询生成器在另一个表中使用列值

在 Laravel 4 查询生成器中使用 Join 删除

生成删除查询

Laravel 4 查询生成器:LEFT JOIN ... AND ... 查询

Laravel 在连接结果上不同,在查询生成器中不起作用