为了更新数据透视表中的单个记录,我使用updateExistingPivot
方法。然而,它需要$ id作为第一个参数。例如:
$step->contacts()->updateExistingPivot($id, [
'completed' => true,
'run_at' => \Carbon\Carbon::now()->toDateTimeString()
]);
但是如何一次更新数据透视表中的多个现有行?
答案 0 :(得分:3)
您可以访问BelongsToMany关系中的allRelatedIds()方法,该方法将返回相对模型的ID的集合,该集合显示在数据透视表中,与初始模型相对应。
然后foreach将完成这项工作:
[{ key: "2015-01", values: {bar1: 123.4, bar2: 32.10} },
{ key: "2015-02", values: {bar1: 1234, bar2: 132.10} },
.. ]
答案 1 :(得分:0)
您只能使用循环语句进行更新,因为updateExistingPivot函数只接受一维参数,请参阅laravel 5.3的核心函数。
File: yoursite\vendor\laravel\framework\src\Illuminate\Database\Eloquent\Relations\BelongsToMany.php
功能:updateExistingPivot
public function updateExistingPivot($id, array $attributes, $touch = true)
{
if (in_array($this->updatedAt(), $this->pivotColumns)) {
$attributes = $this->setTimestampsOnAttach($attributes, true);
}
$updated = $this->newPivotStatementForId($id)->update($attributes);
if ($touch) {
$this->touchIfTouching();
}
return $updated;
}
所以,你应该遵循这个简单的过程:
$step = Step::find($stepId);
foreach(yourDataList as $youData){
$step->contacts()->updateExistingPivot($youData->contract_id, [
'completed' => true,
'run_at' => \Carbon\Carbon::now()->toDateTimeString()
]);
}