【问题标题】:Laravel Filter products by season price with discountLaravel 按季节价格过滤产品并提供折扣
【发布时间】: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 个产品

【问题讨论】:

    标签: php mysql laravel-5 php-7


    【解决方案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 Function

    【讨论】:

    • 感谢您的回答,只是仍然返回两个相同的产品(创建重复)并且带有“final_cost”=>“ec_season.cost”的itme可能是餐桌季节的问题?也许我们需要再做一张有折扣的桌子?产品 -> 季节 -> 季节 _discount
    • 或者更容易选择所有产品,并为每个产品计算正确的价格,在按价格排序收集之后,并执行另一个 sql 请求,它按指示的 id 的顺序给出。或者它会比一个 sql 查询完成的所有这些都慢?
    • 对 100 种产品进行排序和额外查询可能不会太糟糕。如果您能够提出查询结果应该是什么的示例,那么这可能更容易实现。 SQL Fiddle 会更好。
    • 现在我试试这个 sql SELECT * FROM products, (SELECT * FROM ec_season WHERE Duration = ( SELECT MAX(Duration) FROM ec_season WHERE Duration
    • 我不确定,如果您能够创建 SQL Fiddle,那么尝试和修复会更容易。
    猜你喜欢
    • 2019-04-18
    • 1970-01-01
    • 2015-08-22
    • 1970-01-01
    • 1970-01-01
    • 2018-07-06
    • 2020-01-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多