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 товаров






Что-то вроде этого могло бы быть лучше, хотя не уверен, что я уловил все ваши требования. Также непроверенный.
// 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');
или проще выбрать все продукты и рассчитать для каждого правильную цену после этой сортировки по цене и выполнить другой запрос sql, который он выдает в этом порядке как указанный идентификатор. или это будет медленнее, чем все это сделать одним sql запросом?
Наверное, будет не так уж плохо сделать сортировку и дополнительные запросы для 100 товаров. Если вы можете привести пример того, какими должны быть результаты запроса, возможно, будет легче работать над этим. SQL Fiddle было бы даже лучше.
Теперь я пробую этот 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?
Я не уверен, что если вы можете создать скрипт SQL, то это будет проще попробовать и исправить.
Привет, @ martincarlin87 sqlfiddle.com/#!9/79bb30/4/0 вот он. Но дайте мне неправильную окончательную цену за товар 1. Должен дать 40
спасибо за ответ, просто все равно возвращает два одинаковых товара (дубликаты создаются) и итме с "final_cost" => "ec_season.cost" может быть проблемой в таблице Season? может нам нужно сделать еще один стол, где будет скидка? товар -> сезоны -> сезоны _discount