批量更新相关机型

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 名称做了一些假设;根据需要调整。