Laravel Eloquent多参数筛选返回结果不符合预期修复方案
Laravel Eloquent 多参数联合筛选问题修正
问题原因
你当前代码使用了orWhereBetween方法,导致查询逻辑为「满足公司名称条件 或者 满足日期区间条件」,只要符合任意一个条件就会返回数据,因此会出现公司bb的记录符合日期区间就被返回的问题。你的需求是两个条件同时满足,需要把逻辑或改为逻辑与。
基础修正代码
直接把orWhereBetween替换为whereBetween即可:
$objFetch = OpenOrder::where('companyName', $request->majorCompanies) ->whereBetween( 'StartDate', [$request->startDate_start, $request->startDate_end] ) ->orderBy('id', 'desc') ->get(); return response()->json([ 'success' => true, 'objects' => $objFetch ]);
可选参数优化方案
如果你的筛选参数是可选的(比如用户可以只选公司不选日期,或者只选日期不选公司),可以用Laravel提供的when方法做动态条件判断,避免空参数查询异常:
$objFetch = OpenOrder::query() // 只有传入公司参数才加公司筛选条件 ->when($request->filled('majorCompanies'), function ($query) use ($request) { $query->where('companyName', $request->majorCompanies); }) // 只有传入完整的起止日期才加日期区间筛选 ->when($request->filled(['startDate_start', 'startDate_end']), function ($query) use ($request) { $query->whereBetween('StartDate', [ $request->startDate_start, $request->startDate_end ]); }) ->orderBy('id', 'desc') ->get(); return response()->json([ 'success' => true, 'objects' => $objFetch ]);
效果验证
按照你给出的测试条件(选择公司aa、日期范围2/24/2021到2/30/2021),修正后会仅返回两条同时符合「company为aa」和「StartDate在指定区间」的记录,不会返回company为bb的记录,符合预期。
内容的提问来源于stack exchange,提问作者Mohamed Raza
相关产品推荐
相关产品推荐

