Laravel 批量分离

Laravel Bulk Detach

首先,我通过这种方法在 laravel 中使用 detach(),这是可行的!

$student = \App\StudentRegistrars::withTrashed()->findOrFail($id);
$student->father_registrars()->detach();
$student->mother_registrars()->detach();  

但是当我试图在 laravel 中进行大规模分离时,我做不到。

$students = \App\StudentRegistrars::whereIn('id', $ids);
$student->father_registrars()->detach();
$student->mother_registrars()->detach(); 

关于这个问题有什么解决办法吗?

您的代码存在不少问题。你很接近,但还不够。

首先,您需要了解您的变量是什么。目前,这不起作用,因为 $student 未定义。您将变量命名为 $students(带有 's'),因此请确保您使用的是正确的变量。

其次,在您调用 detach() 时,您的 $students 变量是 Builder class 的一个实例,而不是单个 StudentRegistrars 实例。您需要使用 closure:

来完成您的查询
$students = \App\StudentRegistrars::whereIn('id', $ids)->get();

第三,detach()方法只适用于单个实例,所以如果你调用$students->father_registrars()->detach(),它仍然会失败。

您需要迭代结果并逐个调用 detach()

foreach ($students as $student) {
  $student->father_registrars()->detach();
  $student->mother_registrars()->detach(); 
}

因此,您的最终代码将是:

$students = \App\StudentRegistrars::whereIn('id', $ids)->get();
foreach ($students as $student) {
  $student->father_registrars()->detach();
  $student->mother_registrars()->detach(); 
}

有更有效的大规模分离方法,例如直接从数据透视表中查询和删除记录table(或tables):

DB::table('pivot')->whereIn('column', $ids)->delete();

但是这个答案可以解决你的逻辑问题。