我有一个包含复选框的表单,该复选框具有假日名称的值/列表。
这种情况是多对多关系,其中一个区域可以申请一个/多个假日,而一个假日可以由一个/多个区域应用。
因此,有一个名为Zone_Holidays的数据透视表
-----------------------
Zone_ID | Holiday_ID
-----------------------
1 | 3
1 | 2
2 | 1
2 | 2
2 | 3
3 | 2
-----------------------
根据区域检查“假日”时,将显示PIVOT表的结果。
第一次输入没有问题。问题是当我想通过单击复选框上的(选中/未选中)更新区域的假日时,没有任何改变。
我在控制器上的update()函数中尝试过的方法是
在刀片服务器中,
<?php
$zone_id = $dataTypeContent->getKey();
$holidays = Holiday::select('id','holiday_name')->get();
$zone_holiday = ZoneHoliday::where('zone_id', $zone_id)->pluck('holiday_id')->toArray();
?>
<div class="form-group">
@foreach ($holidays as $hol)
<div class="col-md-4">
<input type="checkbox" value="{{$hol->id}}" name="holidays[]" {{in_array($hol->id,$zone_holiday)?'checked':''}} >
{{ $hol->holiday_name }}
</div>
@endforeach
</div>
在控制器中,
public function _update(Request $request, $id) {
$holidays = $request->input('holidays');
if(!empty($holidays))
{
$delete_holidays = ZoneHoliday::where('zone_id', $id)->delete(); //failed at this state
if($delete_holidays)
{
for($count = 0; $count < count($holidays); $count++)
{
$data2 = array(
'holiday_id' => $holidays[$count],
'zone_id' => $id,
);
$insert_holiday[] = $data2;
}
ZoneHoliday::insert($insert_holiday);
}
}
}
此操作的结果是,数据透视表中没有任何内容被删除,但是控制器收到了假日和区域ID的请求。
希望任何人都可以提供帮助,谢谢。
答案 0 :(得分:0)
您似乎正在寻找的是sync
方法,您也可以在laravel文档https://laravel.com/docs/5.8/eloquent-relationships#updating-many-to-many-relationships
public function _update(Request $request, $id) {
// I'd expect this to be an array of IDs e.g. [1,2,3]
$holidays = $request->input('holidays');
$zone = Zone::find('id', $id);
$zone->holidays()->sync($holidays);
...
}
这当然只有在您相应地设置了位置之后才能起作用。 https://laravel.com/docs/5.8/eloquent-relationships#many-to-many
似乎您当前有一个关系模型-如果它仅包含两个ID,我认为您实际上并不需要它,因为您可以直接通过关系查询所有相关信息。如果您有很多数据透视属性,则可能会有所不同。
答案 1 :(得分:0)
使用以下代码
public function _update(Request $request, $zone_id)
{
$zone = Zone::find($zone_id);
$zone->holidays()->sync($request->holidays);
}