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();
但是这个答案可以解决你的逻辑问题。
首先,我通过这种方法在 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();
但是这个答案可以解决你的逻辑问题。