我有users
和user_roles
个表,而user_roles的ID在foreign key
中用作users
。我使用users
从User::with('userRole')->find($user)
获取了数据。在返回的结果中,userRole
存在,但它是空的,而应该是来自user_roles
的特定foreign key
的数据。
请分享可能存在的功能问题,或者是否有人可以简要解释一下laravel协会的工作。
/* User Model */
public function userRole()
{
return $this->belongsTo('App\UserRole');
}
/* UserRole Model */
public function user()
{
return $this->hasMany('App\User');
}
谢谢,
答案 0 :(得分:3)
Laravel中的多对多关系通常要求您拥有2 models
和3 tables
。一对多关系要求您拥有2 models
和2 tables
。一对一的关系还要求您拥有2 models
和2 tables
。
多对多关系
让我们采用User
和Role
模型,因为每个User
可以有多个角色,一个Role
可以分配给不同的用户,你自然会想要Many to many
关系。现在,您需要创建一个中间表,您将在其中存储结果,为什么?因为您已经定义了User
和Role
,因为它是Many to many
这些对象中没有一个会在其中包含另一个对象的标识符,而是在它们中有自己的标识符。中间表,这就是Laravel
获取关系的方式,它将Models
主键与foreign key
内的intermediate table
连接起来。
一对多关系
让我们再次采用User
和Role
模型,让我们说这次,一个Role
可以分配给多个用户,但只有一个{{} 1}}只能有1 User
。当然,您的Role
模型中会有一个字段role_id
,您将与来自角色User
的用户role_id
相关联。
一对一关系
让我们再次使用id
和User
模型:D我们假设您要为每个用户创建单独的Role
,那么您将拥有Role
和2 models
您的用户表将包含所有用户,您的角色表将包含2 tables
,现在当您尝试检索关系时,如果您定义id, name, user_id
,laravel将仅返回1个结果,无论你在one to one
上有多个相同的user_id
,roles table
只会返回1个角色,因为你明确告诉了他Laravel
的关系。
修改强>
以下是1-to-1
关系的示例:
one to one
答案 1 :(得分:1)
@Tim和@Nikola 谢谢你的努力。
然而,我找到了问题背后的原因。这是因为userRole
模型中User
函数的错误命名。
我在foreign key
表中使用user_roles
user_roles_id
作为users
,并在userRole
模型中定义了名为User
的函数。这导致ORM找不到附加user_roles
数据的相关列。
解决方案是我必须将user_roles_id
的名称更改为user_role_id
或userRole
将函数名称更改为userRoles
。我选择第一个,它工作得很好。 :)
有关laravel命名约定的参考,请参阅Laravel - Database, Table and Column Naming Conventions?。