2017-01-07 5 views
1

У меня есть SQL-запрос для реализации в Laravel. Мой запрос:Laravel Query Builder - Получить результат таблицы `as`

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') 

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

+0

'leftJoin (DB :: raw ('(SELECT * FROM officer_rank_details WHERE void = 0) как r'), 'ra.rank', '=', 'r.present_rank')'. Но исходный запрос - не лучший способ сделать это. Вы должны переместить 'void = 0' ito предложение ON. И почему вы используете 'GROUP BY' без какой-либо совокупной функции? –

+0

Я думаю, что это сработает. Я использую функцию 'SUM()' для получения некоторого количества. Я не писал об этом здесь, потому что слишком долго –

ответ

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; 

В Laravel:

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, потому что это не имеет смысла, так, как вы его используете.

+0

Спасибо .. Как я уже сказал, я использовал группу для получения 'SUM()' здесь, я просто удаляю это и использую 'SELECT *' –

+0

@Foxa OK - получил его. Но я буду держать его без «GROUP BY» здесь, поэтому другие люди не смущаются. Вы можете, конечно, добавить его в свой код еще раз. –