如何在Laravel 5.8查询构建器中添加支付类型判断的if..else条件
解决方案
你可以通过Laravel查询构造器的DB::raw()方法结合SQL的CASE WHEN语句来添加这个条件判断列,同时修正原查询中潜在的条件优先级问题,具体修改如下:
public static function getAllData() { $records = DB::table('orders as t1') ->leftjoin('payments as t2', 't1.ord_id', '=', 't2.pay_ord_id') ->leftjoin('members as t3', 't2.pay_creator_id', '=', 't3.mbr_usr_id') ->where('t2.pay_confirm', 1) ->where(function ($query) { $query->where('t1.ord_status','completed') ->orWhere('t1.ord_status','processing'); }) ->select( 't1.ord_id', 't1.ord_date', 't1.ord_total', 't3.mbr_mobile', 't3.mbr_name', 't3.mbr_family', DB::raw("CASE WHEN t2.pay_type_id = 189 THEN 'Paid With Wallet' ELSE 'Paid Online' END as payment_type") ) ->get(); return $records; }
关键说明:
- 添加支付类型列:通过
DB::raw()嵌入SQL的CASE WHEN逻辑,判断t2.pay_type_id的值,生成名为payment_type的自定义列,完全匹配你需要的显示规则。 - 修正条件优先级:原代码中
where('t2.pay_confirm', 1)后直接跟where+orWhere会导致逻辑错误,用闭包包裹ord_status的两个条件,确保只有t2.pay_confirm = 1且订单状态为completed或processing的记录才会被筛选。
如果偏好更简洁的写法,也可以用selectRaw()替换select()+DB::raw()的组合:
->selectRaw("t1.ord_id, t1.ord_date, t1.ord_total, t3.mbr_mobile, t3.mbr_name, t3.mbr_family, CASE WHEN t2.pay_type_id = 189 THEN 'Paid With Wallet' ELSE 'Paid Online' END as payment_type")
内容的提问来源于stack exchange,提问作者Pouya Vaghefi
相关产品推荐
相关产品推荐

