2015-08-14 3 views
1

Я работаю над проектом с немного сложной моделью, которая объединяет в своих отношениях, а также требует параметра. Все это работает очень хорошо, за исключением случаев, когда мне нужно с нетерпением загружать отношения, поскольку я не мог понять, есть ли способ передать ему параметр/переменную.Laravel 5 Eager Загрузка с параметрами

Контроллер

$template = Template::find($request->input('id')); 
$this->output = $template->zones()->with('widgets_with_selected')->get(); 

Модель

public function widgets_with_selected($banner_id) 
{ 
return $this->belongsToMany('App\Models\Widget', 'zone_has_widgets') 
    ->leftJoin('banner_has_widgets', function($join) use($banner_id) { 
     $join->on('widgets.id', '=', 'banner_has_widgets.widget_id') 
      ->where('banner_has_widgets.banner_id', '=', $banner_id); 
    }) 
    ->select('widgets.*', 'banner_has_widgets.banner_id'); 
} 

Это возвращает ошибку в Отсутствует аргумент как переменная не передается.

Я решил проблему, переместив логику на контроллер, но я хочу знать, есть ли способ сохранить отношения в модели и просто вызвать ее с помощью параметра.

ответ

1

Глядя на код laravel, я не думаю, что это возможно, поскольку вы хотели бы это сделать. Вы просто не можете передать параметры вызову с().

Возможное обходное решение - иметь атрибут вашей модели для $ banner_id.

$template = Template::find($request->input('id')); 
$template->banner_id = 1; 
$this->output = $template->zones()->with('widgets_with_selected')->get(); 

Затем измените ваши отношения

public function widgets_with_selected() 
{ 
    return $this>belongsToMany('App\Models\Widget','zone_has_widgets') 
      ->leftJoin('banner_has_widgets', function($join) use($this->banner_id) { 
       $join->on('widgets.id', '=', 'banner_has_widgets.widget_id') 
       ->where('banner_has_widgets.banner_id', '=', $banner_id); 
      }) 
      ->select('widgets.*', 'banner_has_widgets.banner_id'); 

}

Вы могли бы, возможно, изменить его немного, передавая banner_id через метод. Sortof как это в вашей модели:

public function setBanner($id) { 
    $this->banner_id = $id; 
    return $this; 
} 

Тогда вы можете сделать:

$template->setBanner($banner_id)->zones()->with('widgets_with_selected')->get(); 

Не уверен, если это работает, и это действительно не чистое решение, но хак.

+0

Мне нравится ваше мышление. К сожалению, отношения находятся в модели зон, поэтому ничего из этого не получается:/ –

+0

Ах да, вы правы. Я думаю, что это просто невозможно, не сохранив banner_id где-нибудь. Если не модель, то возможно Cache :: использование драйвера массива. Неважно, где вы его храните, это некрасиво. –

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