Laravel Фильтр товаров по сезонной цене со скидкой

Laravel получает сезонную цену со скидкой и фильтрует продукт по цене ASC.

У меня есть таблица сезонов с этим

+----+------------+------------+------------+-------+------+----------+------------+------------+------------+
| id | base_price | startDate  | endDate    | cost  | type | Duration | product_id | created_at | updated_at |
+----+------------+------------+------------+-------+------+----------+------------+------------+------------+
|  1 |     100.00 | 1537390800 | 1538773200 | 95.00 | day  |        2 |          9 | NULL       | NULL       |
|  2 |     100.00 | 1537390800 | 1538773200 | 85.00 | day  |        3 |          9 | NULL       | NULL       |
|  3 |     100.00 | 1537390800 | 1538773200 | 75.00 | day  |        4 |          9 | NULL       | NULL       |
|  4 |     100.00 | 1537390800 | 1538773200 | 70.00 | day  |        5 |          9 | NULL       | NULL       |
+----+------------+------------+------------+-------+------+----------+------------+------------+------------+

и таблица продуктов

+----+----------------------------+-----------+-----+-------+---------+--------------+---------------------+---------------------+---------------------+
| id | alias                      | status    | img | price | user_id | published_at | deleted_at          | created_at
 | updated_at          |
+----+----------------------------+-----------+-----+-------+---------+--------------+---------------------+---------------------+---------------------+
|  8 | toyota-corolla-1-6-elegant | draft     | 18  | 30    |       1 | 2018-08-14   | NULL                | 2018-08-14 15:06:12 | 2018-08-20 14:58:18 |
|  9 | test                       | published |     | 0     |       1 | 2018-08-23   | 2018-09-10 19:44:29 | 2018-08-23 14:45:18 | 2018-09-10 19:44:29 |
+----+----------------------------+-----------+-----+-------+---------+--------------+---------------------+---------------------+---------------------+

как видите, у нас есть три возможных варианта

1) если у нас не было цены по сезонной таблице для выбранных дней, мы используем цену из таблицы продуктов

2) если у нас есть цена в base_price, но нет, но нет скидки мы используем base_price

3) если мы выбрали 2 дня (и попали в диапазон дат), мы используем стоимость поля в этом случае 95 $

Я пробовал этот код, но он показывает только один продукт, в то время как мне нужно показать все продукты с динамической ценой.

$products_obj->join('ec_season', function ($join) use($days) {
            $join->on( 'ec_products.id', '=', 'ec_season.product_id' )
                 ->where( 'ec_season.cost', DB::raw( "(
    select min(ec_season.cost)
    from ec_season
    where  `ec_season`.`product_id` = `ec_products`.`id`  and `ec_season`.`type` = 'day' and `Duration` <= '3'
)
" ) );
        });

Я использую laravel 5.6. не могли бы вы помочь мне с этим?

Могу ли я через MySQL создать новое поле с окончательной стоимостью (final_cost)? и его можно отсортировать по final_cost

Редактировать 1

новый код, но он по-прежнему возвращает дубликаты продукта и показывает final_cost "=>" ec_season.cost " вместо цены

$products_obj->leftJoin('ec_season', 'ec_season.product_id', '=', 'ec_products.id')         
                     ->select('*',
                DB::raw("COALESCE('ec_season.cost', 'ec_season.base_price', 'products.price') as final_cost"))
                                     ->where('ec_season.type', 'day')
                                     ->where('ec_season.Duration', '<=', 3)
                                     ->orderBy('final_cost', 'desc');

Редактировать 2 или проще выбрать все продукты и рассчитать для каждого правильную цену после этой сортировки по цене и выполнить другой запрос sql, который он выдает в этом порядке как указанный идентификатор. или это будет медленнее, чем все это сделать одним sql запросом? если например у нас есть 100 товаров

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
0
881
1

Ответы 1

Что-то вроде этого могло бы быть лучше, хотя не уверен, что я уловил все ваши требования. Также непроверенный.

// use a left join to select all products, not just those with a related entry in the seasonal table
$products_obj->leftJoin('ec_season', 'ec_season.product_id', '=', 'ec_products.od')
    // maybe need to update the * to only select columns you need and prevent collisions
   // but just showing my idea which is to use COALESCE
    ->select('*', DB::raw("COALESCE('ec_season.cost', 'ec_season.base_price', 'products.price') as final_cost")
    ->where('ec_season.type', 'day')
    ->where('ec_season.Duration', '<=', 3)
    ->orderBy('final_cost', 'desc');

COALESCE MySQL Функция

спасибо за ответ, просто все равно возвращает два одинаковых товара (дубликаты создаются) и итме с "final_cost" => "ec_season.cost" может быть проблемой в таблице Season? может нам нужно сделать еще один стол, где будет скидка? товар -> сезоны -> сезоны _discount

Виктор Лернер 25.09.2018 12:59

или проще выбрать все продукты и рассчитать для каждого правильную цену после этой сортировки по цене и выполнить другой запрос sql, который он выдает в этом порядке как указанный идентификатор. или это будет медленнее, чем все это сделать одним sql запросом?

Виктор Лернер 25.09.2018 13:15

Наверное, будет не так уж плохо сделать сортировку и дополнительные запросы для 100 товаров. Если вы можете привести пример того, какими должны быть результаты запроса, возможно, будет легче работать над этим. SQL Fiddle было бы даже лучше.

martincarlin87 25.09.2018 13:56

Теперь я пробую этот sql SELECT * FROM products, (SELECT * FROM ec_season WHERE Duration = (SELECT MAX (Duration) FROM ec_season WHERE Duration <= 3)) as t1 LEFT OUTER JOIN t1 ON t1.product_id = products.id, но он дает me # 1146 - Таблица "****. t1" не существует как прикрепить к товарам t1?

Виктор Лернер 25.09.2018 14:42

Я не уверен, что если вы можете создать скрипт SQL, то это будет проще попробовать и исправить.

martincarlin87 25.09.2018 15:49

Привет, @ martincarlin87 sqlfiddle.com/#!9/79bb30/4/0 вот он. Но дайте мне неправильную окончательную цену за товар 1. Должен дать 40

Виктор Лернер 04.10.2018 13:32

Другие вопросы по теме