Laravel 属于ToMany 获得一条记录

Posted

技术标签:

【中文标题】Laravel 属于ToMany 获得一条记录【英文标题】:Laravel belongsToMany get one record 【发布时间】:2021-08-25 04:24:39 【问题描述】:

我有如下三张表:

用户 id|name|用户名|密码

角色 身份证|姓名

users_roles id|user_id|role_id

这些表通过 belongsToMany 进行通信。 表 users_roles 有很多记录。用户可以更改他的角色,但我必须存储每个更改。

id user_id role_id
1 2 2
1 3 2
1 2 3

第一。如何获取用户的最后一个和单个 role_id?

$users = User::with('roles')->get();

现在我让 user(2) 有两个角色,但我需要 user(2) 有一个角色和最后一个角色(3)。

第二。如何访问刀片上的角色->名称?

@foreach($users as $user)
     $user->name  <<< normal
     $user->roles['name']  <<I'm getting error here  

【问题讨论】:

你使用的是什么版本的 Laravel? Laravel 版本为 8.40 【参考方案1】:

roles 将是一个collection,所以你可以使用last() 方法并有类似的东西:

$user->roles->last()->name;

或者,如果你可以更新到 Laravel >= 8.42,你可以使用Has one of many relationship。

在您的 User 模型中创建新关系:

public function latestRole()

    return $this->hasOne(Role::class)->latestOfMany();

然后您将使用latestRole 加载角色:

$users = User::with('latestRole')->get();

这样你可以直接访问关系:

@foreach($users as $user)
     $user->latestRole->name 

【讨论】:

如果我错了请纠正我,但latestOfMany 仅适用于 1:N 而不适用于 N:N 关系。否则你会得到Unknown column 'users.role_id' in 'field list' @Luciano 是的,我相信你是对的。我可能是错的(这可能取决于您的具体情况),但如果您为数据透视表设置了模型,您可以使用hasOneThrough。【参考方案2】:

你可以使用 whereHas

 $users = User::with('roles')->whereHas('roles', function ($q) 
        $q->latest();
    )->get();

【讨论】:

以上是关于Laravel 属于ToMany 获得一条记录的主要内容,如果未能解决你的问题,请参考以下文章

如何签入 ::whereHas 查询某个列值?拉拉维尔

laravel 多条记录到一条记录....但是如何?

Cakephp 3 保存关联属于ToMany

Cakephp 3 - 使用_joinData属于ToMany

按组排序依据Eloquent属于ToMany关系

macOS Core Data – toOne 新记录是不是在创建时自动分配给 toMany 对象?