如何使用查询构造器(Query Builder)实现orders表的多条件筛选查询
问题原因
- 你使用的MySQL
IF()函数缺少第三个参数(条件不成立时的返回值),语法不完整 - 你把
payu、confirmed这类字符串常量用反引号包裹了,MySQL会将其识别为字段名而非字符串值,导致判断逻辑完全失效 - 没有覆盖
paymode为cod时的判断逻辑
方案1:修正whereRaw写法
直接修正SQL语法和字符串包裹方式即可:
$orders = Order::whereHas('products', function (Builder $query) use ($seller) { $query->where('seller_id', $seller->id); }) ->whereRaw('IF(paymode = "payu", pay_status = "confirmed", pay_status = "unconfirmed")') // 如果需要排除其他支付方式的订单,可取消下面一行的注释 // ->whereIn('paymode', ['payu', 'cod']) ->paginate(25);
方案2:使用Laravel查询构造器(更推荐)
无需编写原生SQL,可读性和安全性更高,框架会自动处理语法和转义问题:
$orders = Order::whereHas('products', function (Builder $query) use ($seller) { $query->where('seller_id', $seller->id); }) ->where(function ($query) { $query->where('paymode', 'payu') ->where('pay_status', 'confirmed'); }) ->orWhere(function ($query) { $query->where('paymode', 'cod') ->where('pay_status', 'unconfirmed'); }) // 如果需要排除其他支付方式的订单,可取消下面一行的注释 // ->whereIn('paymode', ['payu', 'cod']) ->paginate(25);
内容的提问来源于stack exchange,提问作者Sid Heart
相关产品推荐
相关产品推荐

