【发布时间】:2019-06-13 03:34:50
【问题描述】:
一个用户可以拥有一个白标。
一个白标可以有很多用户。
我有一个带有whitelabel_id 和user_id 列的数据透视表
我使用->belongsToMany()(反之)建立了两种关系。
我正在使用数据透视表,因为我在 users 表上没有 whitelabel_id(也不会放入),因此它定义为 many-to-many,但实际上它是 one-to-many。我只得到first() whitelabel,因为每个用户只有一个。
考虑到这一点。我如何select * users 与当前认证用户的白标?
我有这个,它可以工作,但这是“Laravel”的方式吗?我觉得它有点过度设计,Laravel 会有一个速记方法。
$user->when(auth()->user()->whitelabel->first(), function ($query) {
return
$query->whereIn('id', auth()->user()->whitelabel->first()->users->pluck('id'));
})
这会检查 auth 用户是否有白标签,然后获取所有具有相同白标签的用户。
Laravel 有这方面的快捷方式吗?
【问题讨论】:
-
如果你正确定义了逆向,auth()->user()->whitelabel->first()->users 应该给你该标签的所有用户。不是吗?
-
可以,但它只需要这样做
when存在白标签关系。这就是为什么我把它放在 $user->when() 部分。也许这真的只是我所需要的,我的解决方案是正确的,这是一个愚蠢的问题?这样做感觉非常错误。 -
它看起来确实有点冗长,但除了添加一个范围之外,很难说你能做些什么。您可以将 ->first() 添加到模型上关系方法的末尾,因为它们只会有一个以节省一些空间。
-
源于没有良好规范化的数据库结构。对于稍微含糊的,可能是 StackOverflow 不恰当的问题,我们深表歉意。 8-) 感谢您的直截了当的回答。
-
无法在关系中返回
first(),因为它返回的是 Eloquent 对象,而不是关系。但是我可以做到->take(1)达到同样的效果。稍微优化一点,但是我仍然必须做whitelabel->first(),因为我仍然返回了一个集合(尽管有 1 个项目)。不过足够接近了!
标签: php laravel eloquent relationship one-to-many