选中/未选中复选框值时更新数据透视表-PHP Laravel

时间:2019-07-19 02:03:23

标签: php html laravel

我有一个包含复选框的表单,该复选框具有假日名称的值/列表。

这种情况是多对多关系,其中一个区域可以申请一个/多个假日,而一个假日可以由一个/多个区域应用。

因此,有一个名为Zone_Holidays的数据透视表

----------------------- 
Zone_ID  |  Holiday_ID
-----------------------   
   1     |      3    
   1     |      2    
   2     |      1    
   2     |      2    
   2     |      3    
   3     |      2
-----------------------

根据区域检查“假日”时,将显示PIVOT表的结果。

第一次输入没有问题。问题是当我想通过单击复选框上的(选中/未选中)更新区域的假日时,没有任何改变。

我在控制器上的update()函数中尝试过的方法是

  • 删除与zone_id匹配的数据透视表中的行
  • 然后再次插入

在刀片服务器中,

<?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':''}} >  
         &nbsp;{{ $hol->holiday_name }}&nbsp;
      </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的请求。

希望任何人都可以提供帮助,谢谢。

2 个答案:

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