Laravel 5 Eager正在加载参数

时间:2015-08-14 07:37:25

标签: laravel-5 eager-loading

我正在开发一个项目,其中包含一些复杂模型,该模型已加入其关系并且还需要一个参数。这一切都运行得很好,除非我需要急切加载关系,因为我无法弄清楚是否有办法将参数/变量传递给它。

控制器

categories

模型

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

由于未传递变量,因此返回缺失参数错误

我已经通过将逻辑移动到控制器来解决了这个问题,但我想知道是否有办法在模型中保持关系,只需用参数调用它。

1 个答案:

答案 0 :(得分:1)

查看laravel代码我不认为这是可能的,因为您想要这样做。你只是不能将参数传递给with()调用。

可能的解决方法是在模型上为$ 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来改变它。在你的模型中像这样排序:

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

然后你可以这样做:

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

不确定这是否有效,并且它不是一个干净的解决方案,而是一个黑客攻击。