没有从关联表中获取数据:Laravel

时间:2018-02-12 20:07:08

标签: php mysql laravel laravel-5.5

我有usersuser_roles个表,而user_roles的ID在foreign key中用作users。我使用usersUser::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');
}

谢谢,

2 个答案:

答案 0 :(得分:3)

Laravel中的多对多关系通常要求您拥有2 models3 tables。一对多关系要求您拥有2 models2 tables。一对一的关系还要求您拥有2 models2 tables

多对多关系

让我们采用UserRole模型,因为每个User可以有多个角色,一个Role可以分配给不同的用户,你自然会想要Many to many关系。现在,您需要创建一个中间表,您将在其中存储结果,为什么?因为您已经定义了UserRole,因为它是Many to many这些对象中没有一个会在其中包含另一个对象的标识符,而是在它们中有自己的标识符。中间表,这就是Laravel获取关系的方式,它将Models主键与foreign key内的intermediate table连接起来。

一对多关系

让我们再次采用UserRole模型,让我们说这次,一个Role可以分配给多个用户,但只有一个{{} 1}}只能有1 User。当然,您的Role模型中会有一个字段role_id,您将与来自角色User的用户role_id相关联。

一对一关系

让我们再次使用idUser模型:D我们假设您要为每个用户创建单独的Role,那么您将拥有Role2 models您的用户表将包含所有用户,您的角色表将包含2 tables,现在当您尝试检索关系时,如果您定义id, name, user_id,laravel将仅返回1个结果,无论你在one to one上有多个相同的user_idroles 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_iduserRole将函数名称更改为userRoles。我选择第一个,它工作得很好。 :)

有关laravel命名约定的参考,请参阅Laravel - Database, Table and Column Naming Conventions?