Красноречивый выбор с объединением и не существует в необработанном заявлении

#sql #laravel #eloquent

Вопрос:

Мне нужно написать такое заявление select:

 SELECT co.id FROM client_order co 
                INNER JOIN client_order_status cos ON cos.id = co.order_status_id AND cos.name IN ('for_shipping', 'to_be_shipped_later') 
                WHERE NOT EXISTS (SELECT 1 FROM dpackage dp WHERE dp.order_id = co.id AND dp.is_spec_label_generated = 1) 
                ORDER BY co.id
 

По Eloquent моему выражению лица это выглядит так:

   $clientOrderEntities = ClientOrder::join('client_order_status', 'client_order_status.id', '=', 'order_status_id')
                ->whereIn('client_order_status.name', ['for_shipping', 'to_be_shipped_later'])
                ->whereNotExists(function($query) use($orderId) {
                    $query->select(DB::raw(1))
                        ->from('dpackage')
                        ->where([
                            ['order_id', '=', $orderId]
                            ['is_spec_label_generated', '=', 1]
                        ]);
                })->get();
 

Я не знаю, как передать идентификатор заказа из первой части запроса в whereNotExists подзапрос


На данный момент это выглядит:

 $clientOrderEntities = ClientOrder::join('client_order_status', 'client_order_status.id', '=', 'order_status_id')
                ->whereIn('client_order_status.name', ['for_shipping', 'to_be_shipped_later'])
                ->whereNotExists(function($query) {
                    $query->select(DB::raw(1))
                        ->from('dpackage')
                        ->where([
                            ['order_id', '=', 'client_order.id'],
                            ['is_spec_label_generated', '=', 1]
                        ]);
                })
                ->select('client_order.*')
                ->get();
 

Этот запрос работает:

 $clientOrderEntities = ClientOrder::join('client_order_status', 'client_order_status.id', '=', 'order_status_id')
                ->whereIn('client_order_status.name', ['for_shipping', 'to_be_shipped_later'])
                ->whereRaw(' NOT EXISTS (SELECT 1 FROM dpackage dp WHERE dp.order_id = client_order.id AND dp.is_spec_label_generated = 1) ')
                ->select('client_order.*')
                ->get();
 

Этот запрос тоже работает и быстрее, чем красноречивые заявления, как написал @Newbie, но я не знаю, почему его ответ был удален:

 $clientOrderEntities = DB::select('SELECT co.* FROM client_order co INNER JOIN client_order_status cos ON cos.id = co.order_status_id AND cos.name IN ("for_shipping", "to_be_shipped_later") WHERE NOT EXISTS (SELECT 1 FROM dpackage dp WHERE dp.order_id = co.id AND dp.is_spec_label_generated = 1) ');
 

Комментарии:

1. Какую ошибку вы получаете сейчас?

2. Ошибки нет, но она снова возвращает две строки, единственную

Ответ №1:

Возможно, определение имени для таблиц поможет вам в этом.

 $clientOrderEntities = DB::table('client_order as co')
    ->join('client_order_status as cos', 'cos.id', '=', 'co.order_status_id')
    ->whereIn('cos.name', ['for_shipping', 'to_be_shipped_later'])
    ->whereNotExists(function($query) {
        $query->select(DB::raw(1))
            ->from('dpackage')
            ->where([
                ['order_id', '=', 'co.id'],
                ['is_spec_label_generated', '=', 1]
                ]);
        })->get();
 

Комментарии:

1. Он возвращает две строки, в то время как необработанный запрос возвращает только одну строку, поскольку во второй строке столбец is_spec_label_generated имеет значение 1, возможно, есть способ написать запрос выше, используя только необработанную инструкцию ?

2. @Джонсон, я не уловил, что ты имеешь в виду. Вы ищете способ выполнения необработанного запроса?