laravel - 急切加载 belongsToMany 关系时,如何链接 ->makeHidden() ?
问题描述
有人对makeHidden()
急切加载时如何使用有任何建议吗?这是我的代码:
$work=Work::with([
'work_category'=>function($query){
$query->with(['companies'=>function($query){
$query->select('companies.id','companies.name');
}]);
},
'prices',
])
->findOrFail($id);
Work 有一个belongsTo('App\WorkCategory')
关系,WorkCategorybelongsToMany('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')
在我的控制器中使用它来在发送之前修剪掉额外的数据,那就太好了。
解决方案
不幸的是,makeHidden()
它不适用于 Laravel 中的关系。不直接也不在相关字段上使用点符号。
您已经触及了我过去使用过的一种解决方案,该解决方案用于select()
将子查询中的关系字段限制为您想要的关系字段,这是一种排除您的数据透视的粗略方法:
$query->with(['companies'=>function($query){
$query->select('id','name', 'something', 'something');
}]);
这在字段有限时有效。但是当您有很多查询或进行很多查询时,它会很痛苦。
另一种选择是做你所做的,并在模型上标记它受保护:protected $hidden=['pivot'];
. 然后,您可以灵活地使用各种方法来->makeVisible('pivot');
动态重新获得对该枢轴的访问权。
推荐阅读
- domain-driven-design - DDD – 如何在其他有界上下文中实现对多语言数据的访问
- java - org.hibernate.exception.GenericJDBCException:关键字“as”附近的语法不正确
- json - 当值不匹配时使用 jq 添加新的 JSON 字段
- java - 我们是否可以使用 Mockito 验证在多个对象之一上调用了一个方法
- javascript - Discord JavaScript 机器人未能踢出用户
- deep-learning - 寻找每个频道都有独立流程的特定 CNN 的文章或参考资料
- javascript - 在 Google 脚本中满足条件时,循环不会停止
- border - 在级别 0 为 Pandas MultiIndex DataFrame 添加边框
- jhipster - jhipster 为生产生成 Angular 静态前端页面
- java - 无法从 Firebase 为 Android 应用上传自定义模型