2017-06-16 64 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