我正在开发一个项目,其中包含一些复杂模型,该模型已加入其关系并且还需要一个参数。这一切都运行得很好,除非我需要急切加载关系,因为我无法弄清楚是否有办法将参数/变量传递给它。
控制器
categories
模型
$template = Template::find($request->input('id'));
$this->output = $template->zones()->with('widgets_with_selected')->get();
由于未传递变量,因此返回缺失参数错误。
我已经通过将逻辑移动到控制器来解决了这个问题,但我想知道是否有办法在模型中保持关系,只需用参数调用它。
答案 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();
不确定这是否有效,并且它不是一个干净的解决方案,而是一个黑客攻击。