如何在Laravel中基于price和sale列获取产品最高有效价格
解决方案
你当前的问题是直接取price的最大值,未结合sale字段的业务逻辑计算有效价格。根据你的需求,以下是几种Laravel下的实现方式,对应不同的有效价格定义:
1. 取每条记录中price和sale的较大值,再求整体最大值
如果有效价格定义为每条记录的实际售价是该记录中price与sale的较高值,再取所有记录的最高值,可使用GREATEST函数:
$products = Product::select( 'products.*', \DB::raw("MAX(GREATEST(price, sale)) as max_effective_price") ) ->groupBy('products.id') ->get();
2. 优先使用sale,无sale时用price,再求整体最大值
如果有效价格定义为每条记录优先取非空的sale,否则取price,再取所有记录的最高值,可使用COALESCE函数:
$products = Product::select( 'products.*', \DB::raw("MAX(COALESCE(sale, price)) as max_effective_price") ) ->groupBy('products.id') ->get();
3. 优先取最高促销价,无促销价时取最高原价
如果需求是产品的最高有效价格为其最高促销价,若无促销价则取最高原价,可使用IFNULL函数:
$products = Product::select( 'products.*', \DB::raw("IFNULL(MAX(sale), MAX(price)) as max_effective_price") ) ->groupBy('products.id') ->get();
根据你的描述,正确结果为750而非800,推测你需要的是第三种方案——优先取促销价的最大值,而非原价的最大值。你可以根据实际业务逻辑调整选择。
内容的提问来源于stack exchange,提问作者nashwa ghazy
相关产品推荐
相关产品推荐

