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