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

Php 正确更新动态表单中的数据,php,mysql,laravel,laravel-5.4,laravel-blade,Php,Mysql,Laravel,Laravel 5.4,Laravel Blade,我有两种型号 Tour.php public function Itinerary() { return $this->hasMany('App\Itinerary', 'tour_id'); } public function tour() { return $this->belongsTo('App\Tour', 'tour_id'); } 及 internative.php public function Itinerary() { return

我有两种型号

Tour.php

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

internative.php

public function Itinerary()
{
    return $this->hasMany('App\Itinerary', 'tour_id');
}
public function tour() 
{
    return $this->belongsTo('App\Tour', 'tour_id');
}
tours
表格:

id | title | content

行程
表格:

id |旅游id |日|计划

我的存储方法如下所示:

  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);
}
公共功能更新(请求$Request,巡更$Tour)
{
$tour->title=$request->title;
$tour->content=$request->content;
$tour->save();
$count=count($request->input('day'));
$temp_day=$request->input('day');
$temp_TINERARY=$request->input('TINERARY');
$tour\u id=$tour->id;
$TINERAY=行程::其中('tour\u id',$tour\u id);
对于($i=0;$i updateOrCreate)([
“tour\u id”=>$tour\u id,
“计划”=>$temp\U行程[$i],
“日”=>$temp_日[$i]
]);
}
会话::flash('success','Tour updated successfully!');
return redirect()->route('tour.show',$tour->id);
}
我遇到的问题是更新方法是添加新的附加行,而不是更新

创建旅游和行程后:

更新旅游和行程后


我已经添加了额外的数据
day3
day4
,但是代码用数据
day2
创建了新行,而不是
day1
。从上周开始,这一直困扰着我。我在这里遗漏了什么,或者我应该使用不同的方法对
行程表进行CRUD操作。请建议。

请注意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]]
);

编辑:查看此处的(简要)文档:。

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


请澄清

看起来您的模型中的关系是反向的。似乎是引用了它们自己。感谢您指出错误。我更正了它。错误只是在这里。我一定是匆忙错过了。您建议的代码片段正在更新和保存一行(最后一行)仅限。我在创建行程时插入了数据
tour|id:1 | day:1 | plan:plan1
,并添加了附加数据
tour|id:1 | day:2 | plan:2
tour|id:1 | day:3 |计划:plan3
。但表中只保存了
tour|id:1 | day:3 |计划:plan3
。您能建议其他方法吗要插入和更新行程表吗?我不确定那里会发生什么。我会再看一看。就我个人而言,我不会摆弄updateOrCreate或类似的函数。我只需要用
$inventary=inventary::find($inventary\u id)
,设置它的值,然后用
$inventary->save()保存它就可以了;