Laravel中如何用get()获取全表列并仅对指定列应用SQL CASE
当然可以!Laravel的查询构造器提供了非常灵活的方式来实现这个需求,完全不用手动列出所有列名。这里有两种简洁的方案:
方案1:使用select('*') + addSelect()
先通过select('*')获取所有原始列,再用addSelect()追加经过CASE语句处理的pick_8和pick_12列(别名和原列名一致会自动覆盖原列值):
$products = Product::where('is_archive', 0) ->select('*') ->addSelect([ DB::raw('CASE WHEN pick_8 = 1 THEN 1 ELSE 0 END AS pick_8'), DB::raw('CASE WHEN pick_12 = 1 THEN 1 ELSE 0 END AS pick_12') ]) ->get();
方案2:使用selectRaw()直接编写SQL片段
如果你觉得上面的写法有点繁琐,可以直接用selectRaw()把所有逻辑整合在一起,*会自动包含所有列:
$products = Product::where('is_archive', 0) ->selectRaw('*, CASE WHEN pick_8 = 1 THEN 1 ELSE 0 END AS pick_8, CASE WHEN pick_12 = 1 THEN 1 ELSE 0 END AS pick_12') ->get();
补充说明
- 两种方案的核心都是利用
*来自动获取所有列,避免手动枚举列名的麻烦。 - 如果你的CASE逻辑比较复杂(比如多个分支),可以把
DB::raw里的语句写得更详细,只要符合SQL语法即可。 - 如果你希望在模型层面统一处理这些字段,也可以考虑使用访问器,但这种方式是在查询后处理数据,而上面的方案是在数据库层面完成处理,性能上会更优。
内容的提问来源于stack exchange,提问作者Muzammil Baloch
相关产品推荐
相关产品推荐

