【问题标题】:Laravel 5 Eager Loading with parametersLaravel 5 Eager Loading 带参数
【发布时间】:2015-08-14 07:37:24
【问题描述】:

我正在开展一个项目,该项目具有一些复杂的模型,该模型已加入其关系并且还需要一个参数。这一切都很好,除了当我需要急切加载关系时,因为我不知道是否有办法将参数/变量传递给它。

控制者

$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');
}

这将返回一个缺少参数错误,因为变量没有被传递。

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

【问题讨论】:

    标签: laravel-5 eager-loading


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

    不确定这是否有效,这不是一个真正干净的解决方案,而是一个 hack。

    【讨论】:

    • 我喜欢你的想法。不幸的是,这种关系在区域模型中,所以这些都不起作用:/
    • 啊,是的,你是对的。我认为如果不将banner_id存储在某个地方,这是不可能的。如果不是模型,那么可能 Cache:: 使用数组驱动程序。不管你把它放在哪里,它都不漂亮。
    • 非常感谢; )
    猜你喜欢
    • 1970-01-01
    • 2021-10-17
    • 1970-01-01
    • 2017-08-19
    • 2020-05-23
    • 2020-11-09
    • 2017-09-17
    • 2014-05-28
    • 1970-01-01
    相关资源
    最近更新 更多