【问题标题】:Laravel hasMany updating relationLaravel 有很多更新关系
【发布时间】:2016-05-29 22:54:06
【问题描述】:

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

【问题讨论】:

  • 你能分享你的表迁移用户和水果吗?您需要在 tablefruit 中搜索 user_id,如果它不存在则创建新的。
  • @Diego182 嘿,我已经添加了我的 user_fruits 表。
  • 你是在使用数据透视表的方式来存储hasMany关系吗??
  • @BashartheCoder 我上面提到的表是存储多关系的表,没有的fruits表只是存储水果id和水果名称,上表是保存id用户的,水果就是这样
  • 我认为人们正在寻求深入研究。我只想知道一种简单的方法来引用我的 user_fruits 表,看看 $AT->fruit_id=$fruits[$a];与用户 ID 一起存在,否则我可能会留下它,因为我的意思是删除它们并在任何人保存用户配置文件时租用可能很糟糕

标签: php mysql laravel


【解决方案1】:

Eloquent 的一个奇怪的省略是 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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-07-03
    • 1970-01-01
    • 1970-01-01
    • 2014-07-10
    • 2015-08-05
    • 2016-10-12
    • 1970-01-01
    • 2017-09-03
    相关资源
    最近更新 更多