Laravel - 将其他列值保存到数据透视表

Posted

技术标签:

【中文标题】Laravel - 将其他列值保存到数据透视表【英文标题】:Laravel - Save additional column value to pivot table 【发布时间】:2020-06-11 16:29:52 【问题描述】:

我想将额外的布尔值保存到数据透视表的中间表中。 我有 belongstoMany 关系的模型。我想像这样保存数据透视表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();

School.php

public function cities()

    return $this->belongsToMany(City::class)->withPivot('is_open')->withTimestamps();

View.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

控制器

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

【问题讨论】:

在控制器中:$school是学校的id吗?确保它是。顺便说一句:一所学校怎么可能在一个以上的城市?不应该是一对多的关系吗? $request-&gt;has('is_open') 总是true,因为它在技术上是一个数组。我认为您需要执行$request-&gt;has("is_open.$school") ? 1 : 0 才能获得特定学校的状态。实际上,如果 $request-&gt;input('school') 也是一个数组,你必须循环它以使 $request-&gt;has("is_open.$school") 工作...... @MaartenVeerman 我本来想对学校/城市说同样的话,但这是一个术语;我知道多个城市有同一个“学校”,但那是因为它有多个“校区” @TimLewis 更改 $request-&gt;has("is_open.$school") ? 1 : 0 给出错误 Array to string conversion。 @Maarten,是的$school id 工作正常,城市/学校的逻辑是同一学校在不同城市的分支。 @deep 是的,请参阅我的第二个注释;我没有看到 $school 是一个 ID 数组。我想我有一个解决方案,让我试试吧。 【参考方案1】:

由于$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);

您的数据透视表中的所有记录都会更新以反映您已通过的内容。通常,您会调用sync(),但这会删除不在$syncArray() 中的任何内容,并且由于这只是更新一个属性,因此您不会想要这样。

【讨论】:

以上是关于Laravel - 将其他列值保存到数据透视表的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 5.8 在数据透视表上保存一对多关系

将数据添加到 Laravel 数据透视表

Laravel - 使用复选框将数据发送到数据透视表

Laravel 数据透视表 id 列

使用 Laravel 数据透视表生成干净格式的 json

Laravel - 将数据保存到多对多关系