Laravel雄辩的模型关系

时间:2018-09-07 12:35:43

标签: php laravel eloquent entrust eloquent--relationship

我的应用基于

Laravel: 5.6.35
PHP 7.2.4
Entrust: 1.9

我的榜样

class Role extends EntrustRole
{
    public function permissions()
    {
        return $this->belongsToMany(Permission::class);
    }

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

我的用户模型是

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

现在您可以在Tinker中注意到

D:\work\www\myapp>php artisan tinker
Psy Shell v0.9.7 (PHP 7.2.4 — cli) by Justin Hileman
>>> App\models\Role::find(1)->users()->get()
Illuminate/Database/QueryException with message 'SQLSTATE[42S22]: Column not found: 1054 Unknown column 'users.role_id' in 'where clause' (SQL: select * from `users` where `users`.`role_id` = 1 and `users`.`role_id` is not null)'
>>> App\User::find(1)->role()->get();
=> Illuminate\Database\Eloquent\Collection {#2937
     all: [],
   }
>>> App\User::find(1)->roles()->get();
=> Illuminate\Database\Eloquent\Collection {#2941
     all: [
       App\models\Role {#2930
         id: 1,
         name: "super-admin",
         display_name: "Super Admin",
         description: "This will be one permission, that can not be assigned or modified.",
         created_at: "2018-09-07 12:11:35",
         updated_at: "2018-09-07 12:11:35",
         pivot: Illuminate\Database\Eloquent\Relations\Pivot {#2927
           user_id: 1,
           role_id: 1,
         },
       },
     ],
   }

我得到App\User::find(1)->roles()的结果,但是我的用户模型具有函数role(),并且App\User::find(1)->role()的集合为空,App\models\Role::find(1)->users()的错误为

所以请给出一些想法,如何解决这个问题?

3 个答案:

答案 0 :(得分:0)

定义关系的方式,您必须明确要求检索该关系:

App\User::with('Roles')->find(1)->roles()

在文档中,用户和角色之间的关系如下:

class Role extends Model
{
    public function users()
    {
        return $this->belongsToMany('App\User');
    }
}

class User extends Model
{
    public function roles()
    {
        return $this->belongsToMany('App\Role');
    }
}

这样,您不必要求恋爱关系

答案 1 :(得分:0)

我想我找到了问题here的答案。如果您通过模型中的hasMany和belongsTo正确定义了关系,但尚未在属于其他表的模型表中提供外键,您的关系不起作用。同样在文档中,它建议使用foreign_key来使用One-to-Many关系。

委托数据库设计基于多对多关系。这样用户就可以扮演多个角色。请参见Laravel documentation中所述。

答案 2 :(得分:0)

问题出在创建关系或在表中的方式上,错误提示

 Unknown column 'users.role_id' in 'where clause'

,这意味着当您建立

之类的关系时,在users表中缺少role_id列。
public function users()
{
    return $this->hasMany(User::class);
}

hasMany将尝试在传递的模型中找到tablename_id,如果要通过第三张表获取它们,可以在belongsToMany模型上使用permission或使用polymorphic relationships