例如:我在我的应用程序中有这些模型。
User
,Profile
,Interest
。
我通过在users
表中添加profiles
列,将user_id
表与profiles
表相关联。我使用数据透视表(profiles
)链接了interests
和interest_profile
,这显然会有两列(profile_id
,interest_id
)
但是,我想查询与个人资料相关联的用户,也要查看与特定兴趣相关联的用户,换句话说:“选择所有(在他们的个人资料中)特定兴趣的用户”。< / p>
我知道我可以通过连接四个表然后使用(where子句)来使用原始SQL来执行此操作。但我想以Laravel方式执行此操作。
提前致谢。
答案 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
模型的关系为profile
而Profile
模型的关系为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();