【问题标题】:Laravel Eloquent relationship Many to ManyLaravel Eloquent 关系 多对多
【发布时间】:2019-06-13 03:34:50
【问题描述】:

一个用户可以拥有一个白标。
一个白标可以有很多用户。
我有一个带有whitelabel_iduser_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


【解决方案1】:

型号:

class Whitelabel
{
    public function users()
    {
       return $this->belongsToMany(User::class);
    }
}
class User
{
    public function whitelabels()
    {
        return $this->belongsToMany(Whitelabel::class);
    }
}

您可以简单地检索记录

$user = User::find(Auth::id())
$user->whitelabels

如果你想返回 Auth 用户的白标签中的所有用户

foreach($user->whitelabels as $whitelabel){
    $whitelabel->users
}

【讨论】:

    猜你喜欢
    • 2019-03-26
    • 1970-01-01
    • 2013-02-09
    • 2013-05-27
    • 2013-05-15
    • 2016-11-03
    • 2014-09-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多