Laravel中如何实现Transaction多条件查询 同时返回request和transfer类型记录
问题原因分析
- 作用域错误:你定义的
$transactionType数组在闭包外部,但是闭包的use语句只引入了$request变量,没有传入$transactionType,闭包内无法访问该数组,导致第二个判断逻辑不生效。 - 逻辑错误:Eloquent查询构造器的
where方法默认使用AND连接条件,叠加两个where相当于要求transactionType同时等于request和transfer,不存在符合该条件的记录。同时你在第一个if分支里直接return $query,后续代码完全不会执行,只会生效第一个查询条件。 - 语法错误:第一个
in_array判断末尾多写了一个右括号,会触发语法报错。
解决方案
最优实现:使用whereIn方法
针对查询字段值在指定数组范围内的场景,Laravel提供了原生的whereIn方法,代码最简洁高效:
$transactionType = ['request','transfer']; $transactions = Transaction::whereIn('transactionType', $transactionType)->get();
闭包动态条件实现(适用于需要额外逻辑判断的场景)
如果确实需要通过闭包动态拼接条件,调整作用域引入、逻辑连接符、去掉提前return即可:
$transactionType = ['request','transfer']; $transactions = Transaction::where(function ($query) use ($request, $transactionType) { if (in_array("request", $transactionType)) { $query->orWhere('transactionType', 'request'); } if (in_array("transfer", $transactionType)) { $query->orWhere('transactionType', 'transfer'); } })->get();
闭包内的多个orWhere会被自动用括号包裹,不会影响闭包外的其他AND查询条件。
内容的提问来源于stack exchange,提问作者Aman Jat
相关产品推荐
相关产品推荐

