Laravel查询多个相关模型

时间:2017-06-02 18:02:07

标签: php laravel orm eloquent query-builder

例如:我在我的应用程序中有这些模型。 UserProfileInterest

我通过在users表中添加profiles列,将user_id表与profiles表相关联。我使用数据透视表(profiles)链接了interestsinterest_profile,这显然会有两列(profile_idinterest_id

但是,我想查询与个人资料相关联的用户,也要查看与特定兴趣相关联的用户,换句话说:“选择所有(在他们的个人资料中)特定兴趣的用户”。< / p>

我知道我可以通过连接四个表然后使用(where子句)来使用原始SQL来执行此操作。但我想以Laravel方式执行此操作。

提前致谢。

2 个答案:

答案 0 :(得分:3)

首先确保您的模型上的关系设置正确,如:

class User extends Model
{
    public function profile()
    {
        return $this->hasOne(Profile::class);
    }
}

class Profile extends Model
{
    public function user()
    {
        return $this->belongsTo(User::class);
    }

    public function interests()
    {
        return $this->belongsToMany(Interest::class, 'interest_profile');
    }
}

class Interest extends Model
{
    public function profiles()
    {
        return $this->belongsToMany(Profile::class, 'interest_profile');
    }
}

然后,您可以使用whereHas()通过相关模型约束查询,并使用点符号来嵌套关系。所以你的查询将是:

User::whereHas('profile.interests', function($query) use ($interestName) {
    return $query->where('name', $interestName);
})->get();

这只会返回一组用户。如果您想要返回他们的个人资料和兴趣,您可以使用with()

User::whereHas('profile.interests', function($query) use ($interestName) {
    return $query->where('name', $interestName);
})
->with('profile.interests')
->get();

答案 1 :(得分:1)

假设User模型的关系为profileProfile模型的关系为interests,则可以执行此操作。

$interest_id = 1;

$users = User::whereHas('profile', function ($query) use ($interest_id) {
    $query->whereHas('interests', function ($query) use ($interest_id) {
        $query->where('id', $interest_id);
    });
})->get();