2016-05-29 7 views
3

だからlaravelにはhasMany関係があります。それを果物と呼ぶことができます。 ユーザはフルーツ1個とプロフィールページにチェックボックスを1つだけ表示できます。現時点 で、私はこのコードLaravel hasMany更新関係

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()やhasManyの関係についてsave()にさえ反対です。だから、削除してもう一度追加する必要があります。高価な複数の削除と挿入を伴わない代替方法は、各フルーツをチェックし、必要なものだけを削除(および追加)することです。私はこれを密接に監視しており、そこから何も出てこない場合は、これをEloquentに追加するためのPRを行うかもしれません。ここで

は、あなたが既に持っている何をしての、わずかにきれいな方法です:

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);