【问题标题】:Laravel Update Related Model with push?Laravel 通过推送更新相关模型?
【发布时间】:2015-06-09 04:25:37
【问题描述】:

我一直在更新具有“hasMany”关系的 eagerloaded 模型。

我有一个这样的模型:

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() 方法,但似乎只适用于单个数组。

【问题讨论】:

    标签: php laravel laravel-5


    【解决方案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');
    

    【讨论】:

    • 谢谢。在我的基础回购中使用 updateMany 方法将起作用。我为此苦苦挣扎了好几个小时,以为有一些推送方法可以完成这项任务。
    猜你喜欢
    • 1970-01-01
    • 2020-05-25
    • 2015-06-13
    • 1970-01-01
    • 2015-10-23
    • 1970-01-01
    • 2016-05-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多