Laravel - 获取具有特定关系的用户

时间:2014-07-25 17:55:29

标签: laravel eloquent

我有一个国家关系的用户。 (的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();

2 个答案:

答案 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)