Проблема псевдонима таблицы запросов Laravel ORM + Raw - PullRequest
0 голосов
/ 30 сентября 2018

Это мой базовый запрос:

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

Когда кому-то нужно отфильтровать некоторые данные, такие как partner_id, в таблице table_two, мы добавляем дополнительный столбец, такой как

$base_query->where(function ($query) {
                   $query->whereNull('p1.cancelled_at');
                   $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")));
                   $query->whereNotExists(function ($query) {
                       DB::select(DB::raw("SELECT * FROM partner_orders p3 WHERE p3.order_id = p1.order_id AND p3.cancelled_at IS NULL"));
                   });
               });

Но после выполнения этого запроса возникает ошибка

SQLSTATE [42S22]: столбец не найден: 1054 Неизвестный столбец «p1.order_id» в «выражении where» (SQL: SELECT MAX(p2.cancelled_at) FROM partner_orders p2 WHERE p2.order_id = p1.order_id)

я думаю, что в этом запросе есть некоторые проблемы.

$base_query->where(function ($query) {
    $query->whereNull('p1.cancelled_at');
    $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")));
    $query->whereNotExists(function ($query) {
        DB::select(DB::raw("SELECT * FROM partner_orders p3 WHERE
            p3.order_id = p1.order_id AND p3.cancelled_at IS NULL"));
        });
    });

`

1 Ответ

0 голосов
/ 30 сентября 2018

DB::select() непосредственно выполняет запрос.

В случае orWhere() используйте только необработанное выражение.

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

В случае whereNotExists() используйте whereRaw():

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

В обоих случаях вы также можете использовать замыкание и построить запрос вручную:

$query->orWhere('p1.cancelled_at', '=', function($query) {
    $query->from('partner_orders')->select([...])->where([...]);
})

$query->whereNotExists(function($query) {
    $query->from('partner_orders as p3')->where([...]);
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...