【问题标题】:Laravel belongsToMany get one recordLaravel 属于ToMany 获得一条记录
【发布时间】: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

标签: laravel eloquent


【解决方案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();

【讨论】:

    猜你喜欢
    • 2019-07-27
    • 2017-10-27
    • 1970-01-01
    • 2020-08-10
    • 2015-01-10
    • 2022-01-14
    • 2018-07-17
    • 2016-12-18
    • 2016-10-11
    相关资源
    最近更新 更多