正确地更新动态表单中的数据

时间:2017-06-16 16:24:01

标签: php mysql laravel laravel-5.4 laravel-blade

我有2个模特

Tour.php

public function Itinerary()
{
    return $this->hasMany('App\Itinerary', 'tour_id');
}

Itinerary.php

public function tour() 
{
    return $this->belongsTo('App\Tour', 'tour_id');
}

tours表:

id|title|content

itineraries表:

id|tour_id|day|plan

我的商店方法如下所示:

  public function store(Request $request)
  {
  $tour = new Tour;
  $tour->title            = $request->title;
  $tour->content          = $request->content;
  $tour->save();

  $itineraries = [];
  $day        = $request->input('day');
  $plan  = $request->input('itinerary');
  foreach ($day as $i => $name) {
      $itineraries[] = new Itinerary([
          'tour_id' => $tour->id,
          'plan' => $plan[$i],
          'day' => $day[$i],
      ]);
  }
  $tour->itinerary()->saveMany($itineraries);
  Session::flash('success','Tour is sucessfully created !');
  return redirect()->route('tour.show',$tour->id);
}

以下是更新方法的代码:

public function update(Request $request, Tour $tour)
{
  $tour->title            = $request->title;
  $tour->content          = $request->content;
  $tour->save();

  $count = count($request->input('day'));
  $temp_day        = $request->input('day');
  $temp_itinerary  =   $request->input('itinerary');
  $tour_id        = $tour->id;
  $itinerary = Itinerary::where('tour_id', $tour_id);

  for($i = 0; $i <$count; ++$i) 
  {
  $itinerary->updateOrCreate([
  'tour_id' => $tour_id,
  'plan' => $temp_itinerary[$i],
  'day' => $temp_day[$i]
  ]);
}
    Session::flash('success','Tour updated sucessfully !');
    return redirect()->route('tour.show',$tour->id);
}

我遇到的麻烦是更新方法是添加新的额外行而不是更新。

创建游览和行程后:After creating tour and itinerary

更新游览和行程After updating tour and itinerary

我添加了其他数据day3&amp; day4但代码创建的新行包含数据day2,但不是day1。自上周以来,一直令人难以置信。我在这里缺少什么,或者我应该在itineraries表上使用不同的方法进行CRUD操作。请建议。

2 个答案:

答案 0 :(得分:0)

我认为updateOrCreate函数的工作方式与您的想法不同。它可以采用两个阵列。如果不存在与第一个数组中给出的所有值匹配的模型,则会创建一个新模型。

在您的情况下,您只使用updateOrCreate的第一个参数,因此您说“如果没有具有此ID,计划和日期的游览:创建具有这些值的新游戏。”

因此,如果您想仅根据现有游览是否与当前ID匹配来更新每个游览,请更改:

$itinerary->updateOrCreate(
    ['tour_id' => $tour_id, 'plan' => $temp_itinerary[$i], 'day' => $temp_day[$i]]
);

对此:

$itinerary->updateOrCreate(
    ['tour_id' => $tour_id], 
    ['plan' => $temp_itinerary[$i], 'day' => $temp_day[$i]]
);

编辑:在这里查看(简要)文档:https://laravel.com/docs/5.4/eloquent#inserting-and-updating-models

答案 1 :(得分:0)

假设如果用户删除特定的动态输入,那么上面的代码是否会删除该记录并更新其他记录?如果有

请说明