2017-06-16 74 views
0

我有2种型号更新数据正确laravel

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 & day4但代码中创建新行数据day2没有,但不是day1后:

创建旅游和行程之后。自上周以来一直令我难以置信。我在这里丢失了什么,或者我应该在itineraries表上使用不同的方法来进行CRUD操作。请建议。

+0

它看起来像你有你的关系向后在你的模型。似乎是在引用他们自己。 – btl

+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

+0

您建议的代码片段仅更新并保存一行(最后一行)。我插入了数据'tour_id:1 |一天:1 |计划:plan1',同时创建行程并添加附加数据'tour_id:1 |日:2 | plan:plan2'和'tour_id:1 |一天:3 |计划:plan3'。但只有'tour_id:1 |一天:3 |计划:plan3'正在保存在表格中。 –

+0

你能否建议其他替代方法来插入和更新行程表? –

+0

我不确定那里会发生什么。我稍微再看一下。 个人而言,我不会摆弄updateOrCreate或类似的功能。我只是用'$ itinerary = Itinerary :: find($ itinerary_id)'来获取一个行程的实例,设置它的值,并用'$ itinerary-> save();' – Arty