如何在ManytoMany中使用同步并将状态添加到数据透视表

时间:2019-08-20 15:13:04

标签: laravel laravel-5 eloquent

我有3张桌子,并且我处于多对多关系。

表“ semaine”

id | name |

表格“生物主题”

id | namebitheme

表“ bitheme_semaine”。在其中添加新的“状态”列

bitheme_id | semaine_id | statut

就我而言,如果存在这种关系,我的状态可以为1或2(在数据库中,该字段的默认值为1)。

在我的编辑表单中,我必须选中复选框:

<input type="checkbox" name="bithemes[]" value="{{ $id }}"> </input>
                        <input type="checkbox" name="statut[]" value="{{ $id }}"> </input>

我也同步了我的表:

  $semaine->update($request->all());
    $semaine->bithemes()->sync($request->input('bithemes', []));

但是,如果选中它,我也想同步状态。 所以我添加了Semaine模型的关系:

 public function bithemes()
{
    return $this->belongsToMany(Bitheme::class)->withPivot('statut');
}

,我尝试测试与:

的同步
$semaine->bithemes()->sync($request->input('bithemes', []), ['statut' => 2]);

但是状态永远不会同步。

2 个答案:

答案 0 :(得分:0)

在您的示例中,sync方法将ID的array作为第一个参数。但是,当您要同步数据透视表的属性时,请为其提供array,其ID为该数组的numeric index,并为数据透视表属性的每个索引的值分别为array

$syncable = [];
foreach($request->input('bithemes', []) as $bithemeId) {
    $syncable[$bithemeId] = ['status' => 2];
}
$semaine->bithemes()->sync($syncable);

为了精确起见,您使用的格式是仅同步一个ID

if (isset($request->input('bithemes')[0])) {
    $semaine->bithemes()->sync($request->input('bithemes')[0], ['statut' => 2]);
}

答案 1 :(得分:0)

完美。 我用:

更改了表单
 <input type="checkbox" name="bithemes[]" value="{{ $id }}" {{ (in_array($id, old('bithemes', [])) || isset($semaine) && $semaine->bithemes->contains($id)) ? 'checked' : '' }}> </input>

                       <input type="checkbox" name="statut[]" value="{{ $id }}"> </input>

和我的控制器:

 $syncable = [];
    foreach($request->input('bithemes', []) as $key => $value) {
        if (!isset ($request->input('statut')[$key])) {$statut = 1;} else {$statut = 2;}
        $syncable[$value] = ['statut' => $statut];
    }
    $semaine->bithemes()->sync($syncable);

现在一切都很好。谢谢