【问题标题】:How can I check if the user has a role for one to one relationship?如何检查用户是否具有一对一关系的角色?
【发布时间】:2021-05-02 18:43:06
【问题描述】:

我有一个具有用户和角色模型的应用程序以及它们之间的一对一关系。如何检查用户是否具有角色。我收到 SQLSTATE[42S22] 错误。

SQLSTATE[42S22]:找不到列:1054 'where 子句'中的未知列'roles.user_id'(SQL:select * from roles where roles.user_id = 1 和 roles.@ 987654326@ 不为空且name = 客户端限制 1)

  • 数据库结构
Users
---------------
* id
* name
* email
* password
* role_id
* created_at

Roles
---------------
 * id
 * name
 * slug
 * created_at
  • 应用/模型/用户
public function role() 
{
    return $this->hasOne(Role::class);
}

public function hasRole(string $role) 
{
    if ($this->role()->where('name', $role)->first()) {
        return true;
    }
    return false;
}
  • 应用/模型/角色
public function users() 
{
    return $this->belongsTo(User::class);
}

【问题讨论】:

  • 该错误通知您尚未在roles 表中定义user_id 列,该列将存储idid。你需要先定义它。
  • 正确吗?一个用户有 1 个角色,一个角色有 1 个用户?如果是正确的,你需要一个名为角色的表吗?或者一个角色可以有很多用户?在这种情况下,role_id 应该在用户表中。
  • @Unflux 实际上,我在 users 表上有一个 role_id,它是一个外部 id。但话又说回来,我无法在 hasRole 公共函数中调用 role() 关系。
  • @FelippeDuarte 我已经在 users 表中有该列,只是我无法在公共函数 hasRole 中调用模型中定义的 role() 关系。跨度>

标签: php laravel eloquent laravel-8


【解决方案1】:

您需要反转关系。用户有 1 个角色,角色有很多用户

角色:

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

用户:

public function role() 
{
    return $this->belongsTo(Role::class);
}

这是一对多的关系。查看文档:https://laravel.com/docs/8.x/eloquent-relationships#one-to-many

【讨论】:

  • 好的,我明白了,但是为什么我不能在hasRole 函数中调用role() 关系呢?它在roles 表中搜索user_id 列,但在users 表中搜索role_id 列。
  • 您可以在修复模型之间的关系后。 Eloquent 将评估关系并构建查询。这就是为什么它试图在role 表中使用user_id 列,因为你的关系是倒置的。
  • 好的,现在我明白了,非常感谢队友,它现在可以工作了 :)
  • 我可以成功检查正在登录的用户是否只有一个角色,但是如果我需要检查一组角色并且其中任何一个满足条件返回,我该怎么办真否则假。这是我正在检查多个角色$this->role()->whereIn('name', $roles)->first(),但我想我无法检查一系列角色。
  • 最好用所有相关代码在 SO 中打开一个新问题。
猜你喜欢
  • 2021-07-13
  • 1970-01-01
  • 1970-01-01
  • 2010-12-22
  • 2019-06-16
  • 2021-10-25
  • 1970-01-01
  • 2021-10-10
相关资源
最近更新 更多