Конструктор запросов Laravel: использование `Case` с `Joins`

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