2016-04-11 9 views
1

Ich möchte alle Benutzer mit dem Typ Student auswählen und alle Länder zählen, die mit ihnen verbunden sind. Die Reihenfolge sollte auf der Anzahl der Länder basieren, die mit ihnen verbunden sind.Laravel Abfrage - Reihenfolge nach Anzahl

Tabelle Benutzer:

id name 
1  user1 
2  user2 
3  user3 
4  user4 
5  user5 

Länder Tabelle:

id  country_name 
1  America 
2  Australia 
3  Argentina 
4  Afghanistan 
5  India 

pivot_countries_user Tabelle:

id  user_id  country_id 
1  1   1 
2  1   2 
3  2   1 
4  3   1 
5  4   2 
6  5   2 
7  4   3 
8  1   4 

user_type Tabelle:

id type  user_id 
1  student 1 
2  student 2 
3  teacher 3 
4  lawyer  4 
5  teacher 5 

Hier ist die Laravel Abfrage, die ich versucht:

DB::table('users') 
->leftjoin('pivot_countries_user','pivot_countries_user.user_id','=','users.id') 
->leftjoin('countries','countries.id','=','pivot_countries_user.id') 
->leftjoin('user_type','user_type.user_id','=','users.id') 
->select('users.name','users.type', 
    DB::raw('count(pivot_countries_user.country_id)')) // should be per user but I don't know how 

Erwartete Ausgabe:

name  type  total_countries 
user1  student 3 
user2  student 1 
+0

Mögliche Duplikat [Laravel MySQL orderBy count] (http://stackoverflow.com/questions/26375845/laravel-mysql-orderby- Anzahl) –

Antwort

0

Die folgende Abfrage erzeugt Ihre erwartete Ausgabe.

Query Builder:

\DB::table('users as u') 
      ->leftJoin('pivot_countries_user as uc','uc.user_id','=','u.id') 
      ->leftJoin('user_type as ut','ut.user_id','=','u.id') 
      ->select([ 
       'u.name', 
       'ut.type', 
       \DB::raw('(SELECT count(*) FROM uc WHERE uc.user_id=u.id) as total_countries')]) 
      ->orderBy('total_countries','DESC'); 
2
DB::table('users') 
->leftJoin('pivot_countries_user','pivot_countries_user.user_id','=','users.id') 
->leftJoin('countries','countries.id','=','pivot_countries_user.country_id') 
->leftJoin('user_type', function ($join) { 
      $join->on('user_type.user_id', '=', 'users.id') 
       ->where('user_type.type', '=', 'student'); 
     }) 
->select('users.name','user_type.type', 
    DB::raw('count(countries.country_id) AS total_countries')) 
->groupBy('users.id') 
->get(); 

dann werden Sie Ergebnis erwartet erhalten:
Name       Typ                   total_countries
benutzer1       Student     benutzer2       Student      

Verwandte Themen