2014-07-25 60 views
0

我有一個與國家關係的用戶。 (的hasMany)Laravel - 獲取具有特定關係的用戶

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(); 

回答

3

這將工作的用戶,只要):

$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.*']); 
+0

非常好!我只嘗試了第一個,因爲我沒有重複。謝謝。 – Ulrira

+0

不客氣。第二個解決方案在性能方面要好得多 - 沒有依賴查詢等 –

+0

@JarekTkaczyk你能幫我嗎?http://stackoverflow.com/questions/35474941/how-to-get-the-max-id-in -a聯接查詢功能於laravel -5-誠信約束violati – Vikram

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模型創建一個數組。

$country_ids=array(4,67); 
$countries=Country::where('id',$country_ids[0])->where('id',$country_ids[1])->get(); 

爲了因爲有數據透視表中沒有重複(用於對例如FK鍵的唯一索引,讓您應該遍歷這樣

foreach($countries->user as $user) 
+0

我不是100%肯定的結果,但你可以的var_dump ($國家),看看你得到什麼。 –

+0

與「whereIn」方法,我會得到所有具有給定國家之一的用戶,我想讓所有國家給出 – Ulrira

+0

的用戶您是對的。看我的編輯。你可以鏈接你的where()。翻譯成WHERE的東西AND something_else –