Laravel更新相关模型与推?

时间:2015-06-08 19:51:51

标签: php laravel laravel-5

我无法更新一个拥有" hasMany"关系。

我有一个这样的模型:

class UserGroup extends Model
{

  public function enhancements()
  {
    return $this->hasMany('App\UserGroupEnhancement');
  }

}

我的控制器将$ userGroup传递给视图,如下所示:

$userGroup = $this->userGroup->with('enhancements')->whereId($id)->first();

然后在我看来我有

  @foreach($userGroup->enhancements as $enhancement)

  <label>{{$enhancement->type}}</label>
  <input class="form-control" name="enhancements[{{$enhancement->id}}][price]" value="{{$enhancement->price}}">

  @endforeach

更新时,如何更新增强关系中的所有记录?它被传回多个阵列。我目前正在做这样的事情。

public function update($id)
{
    $userGroup = $this->userGroup->findOrFail($id);
    $enhancement = \Input::get('enhancements');
    if (is_array($enhancement)) {
        foreach ($enhancement as $enhancements_id => $enhancements_price) {
            $userGroup->enhancements()->whereId($enhancements_id)->update($enhancements_price);
        }
     }
 }

有没有办法可以在不需要foreach循环的情况下做到这一点?我看到了push()方法,但似乎只能在单个数组上工作。

1 个答案:

答案 0 :(得分:1)

没有更好的方法来做到这一点。有一个名为saveMany的Eloquent方法,但它用于创建新记录而不是更新。实施例Doc

$comments = [
    new Comment(['message' => 'A new comment.']),
    new Comment(['message' => 'Another comment.']),
    new Comment(['message' => 'The latest comment.'])
];

$post = Post::find(1);

$post->comments()->saveMany($comments);

我会坚持你的解决方案,你甚至可以创建一个特征或一个基本的Eloquent类,并将该逻辑放在一个方法中,以便所有其他模型可以使用它,如果你需要的话。 类似的东西:

trait UpdateMany {

    public function updateMany($updates, $relationshipName)
    {

        if (!empty($updates)) {
            foreach ($updates as $update_id => $update) {
                $this->{$relationshipName}()->whereId($update_id)->update($update);
            }
       }

    }
}

然后附加到您的模型:

class UserGroup extends Model
{

    use UpdateMany;

    public function enhancements()
      {
        return $this->hasMany('App\UserGroupEnhancement');
      }

}

只需使用:

$userGroup = $this->userGroup->findOrFail($id);
$userGroup->updateMany(\Input::get('enhancements'), 'enhancements');