2016-07-01 3 views
1

users, companies 및 company_user 피벗 테이블이있는 동안 : 사용자 수에 따라 정렬 된 회사를 얻는 방법?Laravel Eloquent 대다수와 많은 관계

다음 쿼리는 거의 같습니다. 여기서 문제는 단지 적어도 한 명의 사용자 만있는 회사를 얻는 것입니다. 사용자 관계가없는 모든 회사는 고려하지 않았습니다.

$companies = Company::->with('users') 
    ->join('company_user', 'companies.id', '=', 'company_user.company_id') 
    ->selectRaw('companies.*, count(*) as `aggregate`') 
    ->groupBy('companies.id') 
    ->orderBy('aggregate', 'desc') 
    ->get(); 

예 출력해야한다 : 위의 쿼리와

company_1 (users: 4) 
company_2 (users: 2) 
company_3 (users: 0) 
company_4 (users: 0) 

출력은 다음과 같습니다 당신의 회사 중 일부는 INNER JOIN에 의해 제거되고 같은

company_1 (users: 4) 
company_2 (users: 2) 

답변

1

것 같습니다. 그렇다면, 당신은 누락 된 데이터를 유지하기 위해 LEFT JOINSUM와 함께가 (행의 카디널리티를 계산)를 사용하여 시도 할 수 있습니다 : 나는 처음 또한 말하자면 COUNT()을 사용하려고했다

$companies = Company::->with('users') 
    ->leftJoin('company_user', 'companies.id', '=', 'company_user.company_id') 
    ->selectRaw('companies.*, 
       sum(case when company_user.company_id is null then 0 else 1 end) as `aggregate`') 
    ->groupBy('companies.id') 
    ->orderBy('aggregate', 'desc') 
    ->get(); 

를하지만 항상에 보였다 NULL 행을 1로 계산하라. 대신 으로 바꾸고 CASE 표현으로 제대로 작동한다.

실행중인 데모 아래 링크를 따라 가까이 얻기

SQLFiddle

+0

. 이제 나는''company_1 (users : 4); company_3 (사용자 : 0); company_4 (사용자 : 0); company_2 (users : 2)''' – Kristo

+0

@Kristo 그러나 원하는 출력이 아닙니까? –

+0

두 명의 사용자가있는 company_2가 주문하지 않았습니다. 사용자가없는 회사 뒤에 있습니다. – Kristo