Laravel有很多更新关系

时间:2016-05-29 22:54:06

标签: php mysql laravel

所以在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();
});

1 个答案:

答案 0 :(得分:0)

对于任何关系,Eloquent的一个奇怪的遗漏是sync()或甚至与save()相反。所以你必须删除并重新添加。不涉及昂贵的多次删除和插入的替代方法是检查每个水果并删除(并添加)仅有必要的水果。我对此进行了密切监控,如果没有任何结果,我可能会制作一个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);