Laravel Фильтр товаров по сезонной цене со скидкой - PullRequest
0 голосов
/ 25 сентября 2018

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 продуктов

1 Ответ

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

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

// 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 Function

...