Laravel获得二级关系

时间:2015-04-21 20:17:06

标签: php laravel model-view-controller orm database-relations

我有三个数据库表:

+------+-----------+---------------------+
| 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 Illuminate\Database\Query\Builder::userType() 

我做错了什么?

2 个答案:

答案 0 :(得分:1)

我相信你们的关系是错误的。这实际上是多对多的关系,这意味着你可以一起摆脱你的UserTypeRelations

所以说,删除UserTypeRelations.php,然后假装关系不再存在。 Laravel将为您处理该表。

然后在您的用户模型中,创建函数...

public function types()
{
    return $this->belongsToMany('UserType', 'user_type_relations','user_type_id', 'user_id');
}

在您的UserType模型中添加函数...

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;
}

答案 1 :(得分:0)

您可以将多个嵌套关系加载到模型中,方法是将它们传递给with的单个调用:

User::with('userTypeRelations.userType') ...

Source