#laravel #case #psql #laravel-query-builder
#laravel #случай #psql #laravel-конструктор запросов
Вопрос:
Я пытаюсь воспроизвести следующий psql
запрос в laravel
:
SELECT
DISTINCT
I.id,
T.id,
T.name,
I.first_name,
I.middle_name,
I.last_name,
I.dob,
CASE WHEN NOT E.email IS NULL THEN '<<' ELSE '' END
FROM individuals AS I
LEFT JOIN titles AS T ON I.title_id = T.ID
LEFT JOIN individuals_emails_map AS IEM ON IEM.individual_id = I.id
LEFT JOIN emails AS E ON E.id = IEM.email_id;
Когда я использую конструктор запросов и пишу:
DB::table('individuals AS I')
->join('titles AS T', 'T.id', '=', 'I.title_id')
->leftjoin('individuals_emails_map AS IEM', 'IEM.individual_id', '=', 'I.id')
->leftjoin('emails AS E', 'E.id', '=', 'IEM.email_id')
->distinct('I.title_id', 'T.name', 'I.first_name', 'I.middle_name', 'I.last_name', 'I.dob')
->select('T.id','T.name', 'I.first_name','I.middle_name','I.last_name','I.dob')
->get();
… он работает нормально, однако, когда я пытаюсь вставить CASE
строку:
DB::table('individuals AS I')
->join('titles AS T', 'T.id', '=', 'I.title_id')
->leftjoin('individuals_emails_map AS IEM', 'IEM.individual_id', '=', 'I.id')
->leftjoin('emails AS E', 'E.id', '=', 'IEM.email_id')
->distinct('I.title_id', 'T.name', 'I.first_name', 'I.middle_name', 'I.last_name', 'I.dob')
->select('T.id','T.name', 'I.first_name','I.middle_name','I.last_name','I.dob',
DB::raw("CASE WHEN NOT E.email IS NULL THEN '<<' ELSE '' END"))
->get();
… Я получаю следующую ошибку:
Undefined table: 7 ERROR: missing FROM-clause entry for table "e"
Что я делаю не так?
Комментарии:
1. В вашем необработанном запросе отсутствует предложение from
2. @dqureshiumar не могли бы вы уточнить? где у меня должно быть предложение from? почему остальная часть запроса работает без предложения from? зачем мне нужно предложение from в соединении?
3. Я не пробовал, но попробуйте изменить кавычки
DB::raw('CASE WHEN NOT E.email IS NULL THEN "<<"ELSE "" END'))
4. @dqureshiumar та же ошибка
5. Убедитесь, что все ваши соединения правильные… Тем не менее, я пытаюсь разобраться. А имя таблицы
e
илиE
?
Ответ №1:
Я думаю, что проблема в вашем случае:
DB::raw("CASE WHEN NOT E.email IS NULL THEN '<<' ELSE '' END"))
это должно быть:
DB::raw('case WHEN E.email is Not NULL THEN "<<" Else " " END resultEmail'))