我开始学习一些Laravel。我正在一个网站上工作,你可以创建一个可以拥有角色的帐户,根据你拥有的角色,你可以做些什么。它是什么并不重要,但让我解释整个情况。
我有3张桌子:
users
的名称,用于存储有关所有用户的信息。roles
,其中存储了有关所有角色的信息(仅id
+ name
)user_roles
,用于存储用户拥有的角色。它有一个id
列(用于PK),一个user_id
列(作为FK到users
。id
)和一个role_id
列(作为FK到{ {1}}。roles
)我有2个型号:
模型用户:
id
模型角色:
class User extends Authenticatable
{
use Notifiable;
/**
* The attributes that are mass assignable.
*
* @var array
*/
protected $fillable = [
'name', 'email', 'password', 'mood'
];
/**
* The attributes that should be hidden for arrays.
*
* @var array
*/
protected $hidden = [
'password', 'remember_token',
];
public function roles() {
return $this->belongsTo('App\Role');
}
}
现在,我在我的一个控制器中所做的是添加以下行:
class Role extends Model
{
protected $table = 'roles';
protected $fillable = ['role'];
}
所以我得到了我的用户,我登录了,我确实添加了一个角色,我确实添加了一个新的user_roles行(我的用户ID和我添加的角色的ID)。但是,var_dump仍然返回一个空数组而不是我拥有的角色。我不明白我做错了什么
答案 0 :(得分:2)
User
- Role
是一种M:M关系。一个用户可以有很多角色;而且,许多用户可以使用一个角色。
对于多对多关系,Laravel(Eloquent)提供belongsToMany
方法。以下是文档:https://laravel.com/docs/5.6/eloquent-relationships#many-to-many
因此,您需要在User
类中替换此方法:
public function roles() {
return $this->belongsTo('App\Role');
}
用这个:
public function roles() {
return $this->belongsToMany('App\Role');
}
此外,您需要告诉Laravel数据透视表的名称。您可以将其作为第二个参数传递给belongsToMany
方法,或者只将其命名为roles_users
,Laravel会将其弄清楚(它是如何做到的也是在文档中)。
答案 1 :(得分:0)
这不是belongsTo的工作原理,您需要使用不同的关系方法,因为belongsTo会检查用户模型中不存在的“roles_id”列。
hasManyThrough应该执行技巧iirc
我不会为你提供直接的解决方案,因为它会提供更多的魅力而不是帮助,但你需要阅读Adding a Styled Map
的文档文档提供了如何通过用户表在中间的某个位置获取国家/地区帖子的示例。