批量更新相关机型
Bulk updates of related models
更新单...
$modelA->update(['status_id' => 1])
更新多个...
ModelA::whereIn('id', $data['ids'])->update(['status_id' => 1])
所以
将模型相关更新为单行可以按如下方式工作...
$modelA->relatedModel()->update(['status_id' => 1])
($modelA 实例通过路由模型绑定提供,relatedModel() method/relationship 在“ModelA”模型中定义)
但是
尝试以下操作时,
ModelA::whereIn('id', $data['ids'])->relatedModel()->update(['status_id' => 1])
我收到一个错误
调用未定义的方法Illuminate\Database\Eloquent\Builder::relatedModel()
看来我不太明白
返回的是什么
ModelA::whereIn('id', $data['ids'])
所以我正在寻找一种更新多行相关模型的方法(显然没有任何类型的循环)。
whereIn()
和许多其他方法,如 where()
、has()
、with()
等 returns 一个 Builder
实例,其中允许您链接其他查询。您无法访问 ModelA
实例方法,例如 Builder 实例上的 relatedModel()
。
您将需要调用 ->get()
,并迭代调用 relatedModel()->update()
:
的结果
foreach(ModelA::whereIn('id', $data['ids'])->get() as $modelA) {
$modelA->relatedModel()->update(['status_id' => 1]);
}
或者,如果您想要一个没有循环的 single-liner,您将需要直接查询 ModelB
模型(或任何 relatedModel()
模型):
ModelB::whereIn('model_a_id', $data['ids'])->update(['status_id' => 1]);
注:假设ModelB
有一个model_a_id
。如果没有,您可以使用 whereHas()
方法代替:
ModelB::whereHas('modelA', function ($query) use ($data) {
return $query->whereIn('model_a.id', $data['ids'];
})->update(['status_id' => 1]);
注意:同样,对您的 table/column 名称做了一些假设;根据需要调整。
更新单...
$modelA->update(['status_id' => 1])
更新多个...
ModelA::whereIn('id', $data['ids'])->update(['status_id' => 1])
所以
将模型相关更新为单行可以按如下方式工作...
$modelA->relatedModel()->update(['status_id' => 1])
($modelA 实例通过路由模型绑定提供,relatedModel() method/relationship 在“ModelA”模型中定义)
但是
尝试以下操作时,
ModelA::whereIn('id', $data['ids'])->relatedModel()->update(['status_id' => 1])
我收到一个错误
调用未定义的方法Illuminate\Database\Eloquent\Builder::relatedModel()
看来我不太明白
返回的是什么ModelA::whereIn('id', $data['ids'])
所以我正在寻找一种更新多行相关模型的方法(显然没有任何类型的循环)。
whereIn()
和许多其他方法,如 where()
、has()
、with()
等 returns 一个 Builder
实例,其中允许您链接其他查询。您无法访问 ModelA
实例方法,例如 Builder 实例上的 relatedModel()
。
您将需要调用 ->get()
,并迭代调用 relatedModel()->update()
:
foreach(ModelA::whereIn('id', $data['ids'])->get() as $modelA) {
$modelA->relatedModel()->update(['status_id' => 1]);
}
或者,如果您想要一个没有循环的 single-liner,您将需要直接查询 ModelB
模型(或任何 relatedModel()
模型):
ModelB::whereIn('model_a_id', $data['ids'])->update(['status_id' => 1]);
注:假设ModelB
有一个model_a_id
。如果没有,您可以使用 whereHas()
方法代替:
ModelB::whereHas('modelA', function ($query) use ($data) {
return $query->whereIn('model_a.id', $data['ids'];
})->update(['status_id' => 1]);
注意:同样,对您的 table/column 名称做了一些假设;根据需要调整。