PHP Laravel实现同一产品不同规格库存数量同行列展示的查询方法
嘿,作为Laravel新手能想到要做这样的数据透视表已经很棒啦!我来帮你一步步实现你想要的表格效果。
首先,我们需要把数据库里的原始数据按产品名称(比如Aqua、Liquid)分组,然后把不同容量(600ml、1000ml)的数量分别放到对应的列里,没有数据的地方填0。下面是具体的实现方法:
步骤1:编写Laravel查询语句
假设你的数据存在名为products的表中(如果表名不同,替换成你实际的表名即可),可以用Laravel的查询构造器来实现:
$productStats = DB::table('products') ->selectRaw(" ROW_NUMBER() OVER (ORDER BY base_name) as `No`, CONCAT(UPPER(LEFT(base_name, 1)), LOWER(SUBSTRING(base_name, 2))) as `name`, COALESCE(SUM(CASE WHEN name LIKE '%600ml%' THEN qty ELSE 0 END), 0) as `qty 600ml`, COALESCE(SUM(CASE WHEN name LIKE '%1000ml%' THEN qty ELSE 0 END), 0) as `qty 1000ml` ") ->selectRaw("SUBSTRING_INDEX(name, ' ', 1) as base_name") ->groupBy('base_name') ->orderBy('base_name') ->get();
我来解释下这段代码里的关键部分:
SUBSTRING_INDEX(name, ' ', 1):把name字段按第一个空格拆分,提取出基础产品名(比如从aqua 600ml得到aqua)CONCAT(UPPER(LEFT(base_name, 1)), LOWER(SUBSTRING(base_name, 2))):把基础产品名转换成首字母大写的格式(aqua→Aqua,liquid→Liquid)SUM(CASE ...):根据容量匹配对应的数量,没有匹配到的话就加0COALESCE(..., 0):确保即使某个容量没有数据,也会显示0而不是空值ROW_NUMBER():生成表格里的序号(1、2...)GROUP BY base_name:按基础产品名分组汇总数据
步骤2:在Blade视图中渲染表格
拿到查询结果后,就可以在Laravel的Blade模板里循环输出表格了:
<table border="1" cellpadding="8" cellspacing="0"> <thead> <tr> <th>No</th> <th>name</th> <th>qty 600ml</th> <th>qty 1000ml</th> </tr> </thead> <tbody> @foreach($productStats as $item) <tr> <td>{{ $item->No }}.</td> <td>{{ $item->name }}</td> <td>{{ $item->{'qty 600ml'} }}</td> <td>{{ $item->{'qty 1000ml'} }}</td> </tr> @endforeach </tbody> </table>
注意:因为列名里有空格,所以要用$item->{'qty 600ml'}这种方式来访问对应的值哦。
这样就能得到你想要的表格效果啦!如果之后有更多容量类型需要处理,我们可以再调整成动态透视的方式,但当前这种静态写法对于新手来说更容易理解和维护。
内容的提问来源于stack exchange,提问作者Dwiky
相关产品推荐
相关产品推荐

