急于加载一个belongsToMany关系时,如何链接-> makeHidden()?

时间:2019-07-14 13:16:30

标签: laravel eloquent nested eager-loading

有人在急于加载时对使用makeHidden()有什么建议吗?这是我的代码:

        $work=Work::with([
            'work_category'=>function($query){
                $query->with(['companies'=>function($query){
                    $query->select('companies.id','companies.name');
                }]);
            },
            'prices',
        ])
        ->findOrFail($id);

工作具有belongsTo('App\WorkCategory')关系,而WorkCategory通过枢轴具有belongsToMany('App\Company')关系。

如果我尝试将->makeHidden('pivot')链接到$query->select('companies.id','companies.name');-我得到一个BadMethodCall exception: Call to undefined method Illuminate\Database\Eloquent\Relations\BelongsToMany::makeHidden()

我这里缺少什么吗?

这是带有令人反感的makeHidden()调用的代码

        $work=Work::with([
            'work_category'=>function($query){
                $query->with(['companies'=>function($query){
                    $query->select('companies.id','companies.name')->makeHidden('pivot');
                }]);
            },
            'prices',
        ])
        ->findOrFail($id);

我的临时解决方法是将protected $hidden=['pivot'];添加到我的公司模型中,但是很高兴能够在需要时访问数据透视表,并在控制器中使用$model->relation->makeHidden('attribute')进行修整发送之前先清除掉多余的数据。

1 个答案:

答案 0 :(得分:1)

不幸的是,makeHidden()不适用于Laravel中的关系。既不直接也不在相关字段上使用点符号。

您已经谈到了我过去使用的一种解决方案,即使用select()来限制子查询中您想要的关系字段,这是一种排除枢轴的粗略方法:

$query->with(['companies'=>function($query){
     $query->select('id','name', 'something', 'something');
}]);

这在字段有限的情况下有效。但是当您有很多查询或进行很多查询时,这很痛苦。

另一种替代方法是执行已完成的操作,并将其标记为受模型保护:protected $hidden=['pivot'];。这样,您便可以在各种方法上具有 的灵活性,可以随时使用->makeVisible('pivot');重新获得对这一数据透视的访问权限。