有人在急于加载时对使用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')
进行修整发送之前先清除掉多余的数据。
答案 0 :(得分:1)
不幸的是,makeHidden()
不适用于Laravel中的关系。既不直接也不在相关字段上使用点符号。
您已经谈到了我过去使用的一种解决方案,即使用select()
来限制子查询中您想要的关系字段,这是一种排除枢轴的粗略方法:
$query->with(['companies'=>function($query){
$query->select('id','name', 'something', 'something');
}]);
这在字段有限的情况下有效。但是当您有很多查询或进行很多查询时,这很痛苦。
另一种替代方法是执行已完成的操作,并将其标记为受模型保护:protected $hidden=['pivot'];
。这样,您便可以在各种方法上具有 的灵活性,可以随时使用->makeVisible('pivot');
重新获得对这一数据透视的访问权限。