laravelorm+raw查询表别名问题

7vux5j2d  于 2021-06-19  发布在  Mysql
关注(0)|答案(1)|浏览(442)

这是我的基本查询:

  1. $base_query = TableOne::join('table_two as p1', 'p1.order_id', '=', 'table_ones.id')
  2. ->join('table_threes as j1', 'p1.id', '=', 'j1.partner_order_id')
  3. ->select('table_ones.*')
  4. ->groupBy('table_ones.id', 'j1.status');

当有人需要筛选表2上的partner\u id之类的数据时,我们会添加这样的额外列,

  1. $base_query->where(function ($query) {
  2. $query->whereNull('p1.cancelled_at');
  3. $query->orWhere('p1.cancelled_at', '=', DB::select(DB::raw("SELECT MAX(p2.cancelled_at) FROM partner_orders p2 WHERE p2.order_id = p1.order_id")));
  4. $query->whereNotExists(function ($query) {
  5. DB::select(DB::raw("SELECT * FROM partner_orders p3 WHERE p3.order_id = p1.order_id AND p3.cancelled_at IS NULL"));
  6. });
  7. });

但是在运行这个查询之后,他们的结果是一个错误
sqlstate[42s22]:找不到列:“where子句”中的1054未知列“p1.order\u id”(sql:select max(p2.cancelled\u at)from partner\u orders p2 where p2.order\u id=p1.order\u id)
我想,他们在这个问题上有些分歧。

  1. $base_query->where(function ($query) {
  2. $query->whereNull('p1.cancelled_at');
  3. $query->orWhere('p1.cancelled_at', '=', DB::select(DB::raw("SELECT MAX(p2.cancelled_at) FROM partner_orders p2 WHERE p2.order_id = p1.order_id")));
  4. $query->whereNotExists(function ($query) {
  5. DB::select(DB::raw("SELECT * FROM partner_orders p3 WHERE
  6. p3.order_id = p1.order_id AND p3.cancelled_at IS NULL"));
  7. });
  8. });

`

9cbw7uwe

9cbw7uwe1#

DB::select() 直接执行查询。
如果是 orWhere() ,仅使用原始表达式。

  1. $query->orWhere('p1.cancelled_at', '=', DB::raw("(SELECT MAX(p2.cancelled_at) [...])"));

如果是 whereNotExists() ,使用 whereRaw() :

  1. $query->whereRaw("NOT EXISTS(SELECT * [...])");

在这两种情况下,还可以使用闭包并手动生成查询:

  1. $query->orWhere('p1.cancelled_at', '=', function($query) {
  2. $query->from('partner_orders')->select([...])->where([...]);
  3. })
  4. $query->whereNotExists(function($query) {
  5. $query->from('partner_orders as p3')->where([...]);
  6. })
展开查看全部

相关问题