2016-05-29 98 views
3

所以在laravel我有一個hasMany關係,讓我們稱它爲水果。 用戶在配置文件頁面上只能有1個水果及其複選框。目前 我有這樣的代碼Laravel有許多更新關係

if (!empty($data['fruits'])) { 
    $fruits = $data['fruits']; 
    foreach($user->fruits as $i) { 
    $i->delete(); 
    } 
    for($a=0;$a<count($fruits);$a++) 
    { 
     $AT = new Fruits; 
     $AT->user_id=$user->id; 
     $AT->fruit_id=$fruits[$a]; 
     $AT->save(); 
    } 
} 

這是什麼做的是檢查是否水果的選擇是空的,如果它不是,刪除現有的與用戶相關聯的水果和創建新的。

這真的很醜,因爲我覺得它好像是。我不確定如何檢查該用戶的水果ID是否已經存在,以及它是否創建它。 任何援助,將不勝感激。

Schema::create('user_fruits', function (Blueprint $table) { 
    $table->engine = 'InnoDB'; 
    $table->increments('id'); 
    $table->integer('user_id')->unsigned(); 
    $table->integer('fruit_id')->unsigned(); 
    $table->foreign('user_id')->references('id')->on('users')->onUpdate('cascade')->onDelete('cascade'); 
    $table->foreign('fruit_id')->references('id')->on('fruits')->onUpdate('cascade')->onDelete('cascade'); 
    $table->timestamps(); 
}); 
+0

你可以分享你的表遷移用戶和水果?你需要在表格水果中搜索user_id,如果它不存在,創建新的。 –

+0

@ Diego182嘿,我已經添加了我的user_fruits表。 –

+0

您是否使用數據透視表方法來存儲'hasMany'關係? –

回答

0

鋒的好奇遺漏是sync()或者甚至是相反save()爲的hasMany關係。所以你必須刪除並重新添加。不涉及昂貴的多次刪除和插入的替代方法是檢查每個水果,並刪除(並添加)只有那些必要的。我正在密切關注這一點,如果沒有任何結果出來,我可能會讓PR加入到Eloquent中。

這裏是做什麼的,你已經有了一個稍微更清潔的方式:

Fruits::where('user_id', $user->id)->delete(); 

$fruits = []; 
foreach ($data['fruits'] as $key => $value) { 
    $fruit = new Fruits(); 
    $fruit->id = $key; 
    $fruits[] = $fruit; 
} 

$user->saveMany($fruits);