【问题标题】:Laravel Query Builder: Using `Case` with `Joins`Laravel 查询构建器:使用“案例”和“连接”
【发布时间】:2021-01-14 11:34:32
【问题描述】:

我正在尝试在laravel 中复制以下psql 查询:

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"

我做错了什么?

【问题讨论】:

  • 原始查询中缺少 from 子句
  • @dqureshiumar 你能详细说明一下吗?我应该在哪里有一个 from 子句?为什么查询的其余部分在没有 from 子句的情况下工作?为什么我需要在连接中使用 from 子句?
  • 我没试过,但尝试更改引号DB::raw('CASE WHEN NOT E.email IS NULL THEN "&lt;&lt;"ELSE "" END'))
  • @dqureshiumar 同样的错误
  • 确保你所有的连接都是正确的......我仍然在试图弄清楚。表名是e 还是E

标签: laravel case psql laravel-query-builder


【解决方案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'))

【讨论】:

    猜你喜欢
    • 2015-03-02
    • 2019-04-01
    • 2014-05-29
    • 2020-08-29
    • 2017-03-09
    • 2016-11-25
    • 2018-07-20
    • 2017-02-15
    相关资源
    最近更新 更多