有没有一种方法在即时加载时给Eloquent关系取别名?例如,我可能有一个如下的查询。
User::with(['roles' => function ($query) { $query->where('type', ADMIN); }]);
字符串
但是,如果我也想立即加载状态为ACTIVE的角色,该怎么办呢?我能想到的唯一方法是在User模型上复制角色关系,并为它给予不同的名称。
User::with([
'roles' => function ($query) { $query->where('type', ADMIN); },
'otherRoles' => function ($query) { $query->where('status', ACTIVE) }]
);
型
我可以在我的用户模型上使用adminRoles
和activeRoles
这样的方法,但这并不是我想要的,因为有太多可能的参数。
3条答案
按热度按时间kx1ctssn1#
你已经表明你不想在你的用户模型上有额外的方法,但是这是除了使用闭包之外的最好方法,你可以通过让你的新方法(如
adminRoles
)利用现有的关系方法和相关模型提供的作用域来改进代码。字符串
然后定义要在
Role
模型上使用的作用域。型
您现在可以立即加载这些作用域关系。
型
qzlgjiam2#
不幸的是,在Laravel(8.x)中,当前不可能实现即时加载时的别名关系。看起来它不会在不久的将来实现,因为Taylor已经关闭了两个PR。
https://github.com/laravel/framework/pull/37656#issuecomment-870604176
https://github.com/laravel/framework/pull/31976#issuecomment-599538731
3htmauhk3#
resolveRelationUsing
怎么样?你可以在你的函数中动态创建你的自定义关系名称:字符串
然后立即加载
otherRoles
关系:型