我有三个数据库表:
+------+-----------+---------------------+
| user | user_type | user_type_relations |
+------+-----------+---------------------+
每个用户可以有多个类型,但一个用户类型只能有一个用户。为了存储此关系,我使用第三个关系表,其结构如下:
+---------------------+
| user_type_relations |
+---------------------+
| id |
| user_id |
| user_type_id |
+---------------------+
我在模型中定义了这样的关系:
User
型号:
public function userTypeRelations()
{
return $this->hasMany('UserTypeRelations', 'user_id', 'id');
}
UserType
型号:
public function userTypeRelation()
{
return $this->hasMany('UserTypeRelations', 'user_type_id', 'id');
}
UserTypeRelations
型号:
public function user()
{
return $this->hasMany('User', 'id', 'user_id');
}
public function userType()
{
return $this->hasMany('UserType', 'id', 'user_type_id');
}
这就是我尝试在将控制器中的特定用户的用户类型传递给视图之前访问该用户类型的方式:
$users = User::with('userTypeRelations')->with('userType')->orderBy($order)->where('status', 'active')->paginate(10);
我以为首先我得到关系表的值,从中我很容易得到每个用户的用户类型,但我得到以下错误:
BadMethodCallException
Call to undefined method IlluminateDatabaseQueryBuilder::userType()
我做错了什么?
您可以通过将多个嵌套关系传递给对with
的单个调用来预先加载多个嵌套关系到模型:
User::with('userTypeRelations.userType') ...
源
我相信你们的关系是错误的。 这实际上是一种多对多的关系,这意味着您可以一起摆脱UserTypeRelations
。
因此,话虽如此,删除UserTypeRelations.php
,然后假装该关系不再存在。 Laravel将为您处理那张桌子。
然后在您的用户模型中,创建函数...
public function types()
{
return $this->belongsToMany('UserType', 'user_type_relations','user_type_id', 'user_id');
}
并在您的用户类型模型中添加函数...
public function users()
{
return $this->belongsToMany('User', 'user_type_relations', 'user_id', 'user_type_id');
}
现在,它不再是嵌套关系。
$user = User::with('types')->find($id);
foreach($user->types as $type) {
echo $type;
}