【发布时间】:2019-02-28 19:54:35
【问题描述】:
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 请求,它按指示的 id 的顺序给出。 或者它会比使用一个 sql 查询完成的所有这些操作要慢?例如,如果我们有 100 个产品
【问题讨论】: