Laravel Query Builder - получить результат таблицы `as`

У меня есть SQL-запрос для реализации в Laravel. Мой запрос:

SELECT *  FROM officer_ranks ra
LEFT JOIN (SELECT * FROM officer_rank_details WHERE void = 0) AS r ON  ra.rank = r.present_rank
LEFT JOIN officer_languages l ON r.officer_id = l.officer_id
GROUP BY(ra.rank)
ORDER BY ra.id ASC;

Для реализации этого запроса я написал:

DB::table('officer_ranks as ra')
->leftJoin(DB::raw('SELECT * FROM officer_rank_details WHERE void = 0'), 'ra.rank', '=', 'present_rank')
->leftJoin('officer_languages as l', 'officer_id', '=', 'l.officer_id')
->groupBy('ra.rank')
->get();

Мой вопрос в том, как получить (DB::raw(...)) таблицу результатов как r, потому что мне нужно JOIN таблиц.

Я пробовал использовать

leftJoin(DB::raw('SELECT * FROM officer_rank_details WHERE void = 0') as r, 'ra.rank', '=', 'present_rank')

Но это не удалось.


person Sathindu Kavneth    schedule 07.01.2017    source источник
comment
leftJoin(DB::raw('(SELECT * FROM officer_rank_details WHERE void = 0) as r'), 'ra.rank', '=', 'r.present_rank'). Но исходный запрос - не лучший способ сделать это. Вам следует переместить void = 0 в предложение ON. И почему вы используете GROUP BY без агрегатной функции?   -  person Paul Spiegel    schedule 07.01.2017
comment
Думаю, это сработает. Я использую функцию SUM(), чтобы подсчитать. Я не публиковал это здесь, потому что это слишком долго   -  person Sathindu Kavneth    schedule 07.01.2017


Ответы (1)


Я написал в комментарии, как исправить свой код. Но ваш исходный SQL должен быть:

SELECT *  FROM officer_ranks ra
LEFT JOIN officer_rank_details AS r 
    ON  ra.rank = r.present_rank
    AND r.void  = 0
LEFT JOIN officer_languages l ON r.officer_id = l.officer_id
ORDER BY ra.id ASC;

В ларавеле:

DB::table('officer_ranks as ra')
    ->leftJoin('officer_rank_details as r', function($join){
       $join->on('ra.rank', '=', 'r.present_rank');
       $join->on('r.void',  '=', 0);
    })
    ->leftJoin('officer_languages as l', 'r.officer_id', '=', 'l.officer_id')
    ->get();

Я также удалил предложение GROUP BY, потому что оно не имеет смысла в том, как вы его используете.

person Paul Spiegel    schedule 07.01.2017
comment
Спасибо .. Как я уже сказал, я использовал group by, чтобы получить SUM() сюда, я просто удаляю это и использую SELECT * - person Sathindu Kavneth; 07.01.2017
comment
@Foxa ОК - понял. Но я оставлю это без GROUP BY здесь, чтобы не смущать других. Конечно, вы можете снова добавить это в свой код. - person Paul Spiegel; 07.01.2017