2015-06-08 2 views
2

Я застрял в обновлении модели с нетерпением, которая имеет отношение hasMany.Laravel Обновить Связанная модель с push?

У меня есть одна модель, как так:

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

Нет лучшего способа сделать это. Существует метод Eloquent, называемый saveMany, но он используется для создания новых записей, а не для обновления. Пример 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); 

Я бы придерживаться вашего решения, вы можете даже создать признак или базовый Красноречивый класс и поместить эту логику в методе, поэтому он может быть использован всеми другими моделями, если вы когда-нибудь нужно , Что-то вроде:

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'); 
+0

Спасибо. Использование метода updateMany в моей базе Repo будет работать. Я боролся с этим часами, думая, что есть какой-то метод толчка для решения этой задачи. – limit

Смежные вопросы