UpdateExistingPivot用于多个ID

时间:2016-04-18 12:31:06

标签: laravel laravel-5 eloquent

为了更新数据透视表中的单个记录,我使用updateExistingPivot方法。然而,它需要$ id作为第一个参数。例如:

$step->contacts()->updateExistingPivot($id, [
    'completed' => true,
    'run_at' => \Carbon\Carbon::now()->toDateTimeString()
]);

但是如何一次更新数据透视表中的多个现有行?

2 个答案:

答案 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()
]);

}