在 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 从多个表中获取数据