Laravel красноречивый запрос для двух таблиц

#mysql #laravel #eloquent

#mysql #ларавель #красноречивый

Вопрос:

У меня есть две таблицы, и я хочу сделать один запрос с помощью count. Мое первое имя таблицы — orders с полями :

идентификатор продукта_id Количество
1 1
2 1
1 2
1 1
2 1

Моя вторая таблица items выглядит следующим образом: поля :

ID идентификатор продукта_id Цена
1 1 2.99
2 2 3.99
3 1 1.99
4 1 5.99

Как вы можете видеть, идентификатор продукта: у 1 больше заказов, но в таблице товаров идентификатор продукта 1 имеет 3 цены, я хочу получить product_id с большим количеством заказов и самой низкой ценой.

мой запрос приведен ниже

 Items::->withCount(['orders' => function($q){
            $q->active();
        }])
        ->orderBy('orders_count', 'desc')
        ->groupBy('product_id')
        ->limit(1)->get();
 

Я получаю товар с большим количеством заказов, но первая запись с ценой 2,99, но я хочу получить 3-ю запись с ценой 1,99 (с тем же идентификатором продукта_id)

Ответ №1:

Я думаю, вы можете использовать другую функцию OrderBy для своего запроса, чтобы получить самую низкую цену. Возможно, приведенный ниже код работает!

 Items::->withCount(['orders' => function($q){
            $q->active();
        }])
        ->orderBy('orders_count', 'desc')
        ->orderBy('price' , 'asc')
        ->groupBy('product_id')
        ->limit(1)->get();
 

Примечание: этот синтаксис работает для laravel версии 7 или выше

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

1. Извините, но это не работает… мое приложение находится в larval 5.7

Ответ №2:

Я предполагаю, что простой необработанный выбор вернет ожидаемый результат

 Items::withCount(['orders' => function($q){
            $q->active();
        }])
        ->select(['product_id', DB::raw('min(price) as lowest_price')])
        ->orderBy('orders_count', 'desc')
        ->groupBy('product_id')
        ->limit(1)
        ->get();