繁体   English   中英

Laravel - 将附加列值保存到 pivot 表

[英]Laravel - Save additional column value to pivot table

我想将额外的 boolean 值保存到 pivot 表的中间表中。 我有模型与belongstoMany关系。 我想像这样保存 pivot 表city_school

但是为所有学校保存了相同的is_open值。 必须为每个 school_id 存储相关的is_open值。

city_id | school_id | is_open
   1          1         0
   1          2         1

我的模型:

City.php

public function schools()
{
    return $this->belongsToMany(School::class)->withPivot('is_open')->withTimestamps();
}

学校.php

public function cities()
{
    return $this->belongsToMany(City::class)->withPivot('is_open')->withTimestamps();
}

查看.blade.php

<div>LA<input type="hidden" name="school[]" value="1">
<input type="checkbox" name="is_open[1]">Open

<div>SF<input type="hidden" name="school[]" value="2">
<input type="checkbox" name="is_open[2]">Open

Controller

$school = $request['school'];
$data->schools()->attach($school, ['is_open' => $request->has('is_open')?1:0]);

由于$schools是一个数组,因此您必须循环并构造所谓的“syncArray”:

$syncArray = [];
foreach ($request->input('schools') as $schoolId) {
  $syncArray[$schoolId] = [
    'is_open' => $request->has("is_open.{$schoolId}") ? 1 : 0
  ];
}

在上面的示例中, $syncArray将包含一个$schoolIds数组,映射到一个“附加属性”数组,在本例中是is_open

[1 => ["is_open" => 1], 2 => ["is_open" => 0]]

然后,您只需调用:

$data->schools()->syncWithoutDetaching($syncArray);

pivot 表中的所有记录都将更新以反映您通过的内容。 通常,您会调用sync() ,但这会删除不在$syncArray()中的任何内容,并且由于这只是更新属性,因此您不希望这样做。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM