Laravel中POST请求返回数组而非对象及orWhere方法报错问题
Laravel按用户角色筛选订单数据的问题解决
问题根源
你当前的实现是先通过InternOrders::all()把所有订单加载到Eloquent Collection中,再进行筛选,这会导致三个问题:
- 第三个条件报错:Collection类没有
orWhere方法,该方法属于查询构造器Builder; - 第二个条件返回对象:Collection转JSON时,若索引不连续会被序列化为对象;
- 性能浪费:先加载全量数据再筛选,数据量大时会严重拖慢接口响应。
修正后的代码
控制器方法
public function getAllInternOrders(Request $request) { $userData = $request; // 初始化查询构造器,不立即查询全量数据 $query = InternOrders::query(); // 传入查询构造器进行条件拼接,最后执行查询 $sortedOrders = $this->sortOrdersBasedOnUserRole($query, $userData)->get(); return response()->json($sortedOrders); }
私有筛选方法
private function sortOrdersBasedOnUserRole($query, $userData) { $userName = $userData->get('displayName'); $userRole = $userData->get('userRole'); if (in_array("1", $userRole)) { $query->where('Referent', $userName); } elseif (in_array("2", $userRole)) { $query->where('Status', '>', 0); } elseif (in_array("3", $userRole)) { // 用whereIn替代链式where+orWhere,更简洁高效 $query->whereIn('Status', [2, 3]); } return $query; }
关键说明
- 用查询构造器
Builder替代Collection进行条件拼接,既能使用orWhere(或更简洁的whereIn),又能在数据库层面完成筛选,减少数据传输量; - 最后调用
get()方法才会执行SQL查询,返回的Collection转JSON时会自动序列化为数组格式,解决前端解析问题; - 第三个条件推荐用
whereIn('Status', [2, 3]),比where()->orWhere()的SQL执行效率更高,代码可读性也更好。
内容的提问来源于stack exchange,提问作者Elodie
相关产品推荐
相关产品推荐

