Laravel 多对多关系搜索
Laravel many to many relation search
我现在有三个模型
用户
public function languages(){
return $this->belongsToMany('App\Language');
}
报纸
public function languages(){
return $this->belongsToMany('App\Language');
}
语言
public function users(){
return $this->belongsToMany('App\User');
}
public function newspapers(){
return $this->belongsToMany('App\Newspaper');
}
我已经有了language_user
,language_newspaper
table
并且在 tinker 中,我已经通过 attach() blablabla 成功地检索了这两个关系。
问题是
我如何搜索 Newspaper
that User
id1 在 eloquent 中有这个 Language
?对我来说似乎很复杂。
User id1 -> has language en, zh
Newspaper id1 -> has language en, jp
->确定
Newspaper id2 -> has language zh
-> 不正常
我已经试过了,但不确定是否正确
$where = [];
foreach ($agent->languages as $language) {
array_push($where, $language->id);}
$newspapers = Newspaper::
join('language_newspaper', function ($join) use ($where) {
$join->on('newspaper.id', '=',
'langauge_newspaper.newspaper_id')
->whereIn('langauge_newspaper.newspaper_id', $where);
})
->groupBy('newspaper.id')
->get();
您应该可以在这种情况下使用 whereHas
,如下所示:
$newspapers = Newspaper::whereHas('languages', function ($q) use ($agent) {
$q->whereIn('id', $agent->languages->lists('id)->all());
})->get();
我现在有三个模型
用户
public function languages(){
return $this->belongsToMany('App\Language');
}
报纸
public function languages(){
return $this->belongsToMany('App\Language');
}
语言
public function users(){
return $this->belongsToMany('App\User');
}
public function newspapers(){
return $this->belongsToMany('App\Newspaper');
}
我已经有了language_user
,language_newspaper
table
并且在 tinker 中,我已经通过 attach() blablabla 成功地检索了这两个关系。
问题是
我如何搜索 Newspaper
that User
id1 在 eloquent 中有这个 Language
?对我来说似乎很复杂。
User id1 -> has language en, zh
Newspaper id1 -> has language en, jp
->确定
Newspaper id2 -> has language zh
-> 不正常
我已经试过了,但不确定是否正确
$where = [];
foreach ($agent->languages as $language) {
array_push($where, $language->id);}
$newspapers = Newspaper::
join('language_newspaper', function ($join) use ($where) {
$join->on('newspaper.id', '=',
'langauge_newspaper.newspaper_id')
->whereIn('langauge_newspaper.newspaper_id', $where);
})
->groupBy('newspaper.id')
->get();
您应该可以在这种情况下使用 whereHas
,如下所示:
$newspapers = Newspaper::whereHas('languages', function ($q) use ($agent) {
$q->whereIn('id', $agent->languages->lists('id)->all());
})->get();