我有一个国家关系的用户。 (的hasMany)
user_id 1
country_id 1
user_id 1
country_id 2
...
我想要的是让那些拥有这两个国家/地区(国家1和国家/地区2)的用户如何才能这样做?我正在阅读http://laravel.com/docs/eloquent#querying-relations,但我不太清楚该怎么做。
编辑:几乎是解决方案
$users = \User::whereHas('countries', function($query) {
$countries_ids = [1, 2, 4];
$query->whereIn('users_countries.country_id', $countries);
})->get();
答案 0 :(得分:3)
只要数据透视表中没有重复项(例如fk键对的唯一索引),这就可以工作:
$countries = [1,5,9];
User::whereHas('countries', function ($q) use ($countries) {
$q->whereIn('users_countries.country_id', $countries);
}, '=', count($countries) )->get();
如果有重复项,例如:
user_id | country_id
1 | 1
1 | 2
1 | 1
然后你需要原始的count(distinct ...)
,所以你不能使用whereHas
,所以我建议这样做,这会更快:
$countries = [1,5,9];
User::join('users_countries as uc','uc.user_id', '=', 'users.id')
->whereIn('uc.country_id', $countries)
->having(DB::raw('count(distinct uc.country_id)'), '=', count($countries))
->groupBy('users.id')
->get(['users.*']);
答案 1 :(得分:0)
你可以用其他方式做到这一点。对国家/地区模型进行查询。在国家/地区模型中添加功能
public function user(){
return $this->belongsTo('user');//or if there is no user_id column in the countries table, use the ('model','local_key','foreign_key') pattern.
}
然后使用country_ids创建一个数组,并对国家/地区模型进行排序。
$country_ids=array(4,67);
$countries=Country::where('id',$country_ids[0])->where('id',$country_ids[1])->get();
为了获得用户,您应该像这样进行循环
foreach($countries->user as $user)