Laravel中合并查询结果后如何按id全局排序?
解决合并查询结果后整体按id排序的问题
哈哈,这个问题我之前也踩过坑!你现在遇到的问题根源在于:你调用get()之后,$query1和$query2已经变成了Eloquent集合对象(也就是从数据库取出来的具体数据),而不是还在等待执行的查询构造器。这时候再合并后用orderBy()根本不会生效——因为orderBy()是查询构造器的方法,只能在数据库层面执行排序,而你已经把数据拿到PHP里了。
给你两个解决方案,优先推荐第一个,效率更高:
方案一:数据库层面合并查询+排序(最优)
直接把两个查询条件合并成一个,让数据库一次性取出所有符合条件的记录并排序,这样性能最好,尤其是数据量大的时候:
// 合并条件,一次查询搞定 $mergedQuery = DB::table('contract') ->where('to_user_id', $to_user_id) ->orWhere('from_user_id', $to_user_id) ->orderBy('id') ->get();
这样数据库会直接返回所有to_user_id或from_user_id等于目标值的记录,并且已经按id排好序了,完全不需要在PHP里合并再处理。
方案二:集合层面整体排序(适合特殊场景)
如果因为某些业务需求,必须要分开查询再合并(比如两个查询有不同的前置处理),那可以用集合的sortBy()方法对合并后的集合做整体排序:
$query1 = DB::table('contract')->where('to_user_id', $to_user_id)->get(); $query2 = DB::table('contract')->where('from_user_id', $to_user_id)->get(); // 合并后用sortBy对整个集合按id排序 $sortedResult = $query1->merge($query2)->sortBy('id'); // 如果需要转换成数组,直接加->toArray()就行 // $sortedResult = $query1->merge($query2)->sortBy('id')->toArray();
这里的sortBy()是集合的方法,会遍历合并后的所有数据,按照id字段重新排序,得到的就是整体有序的结果。
内容的提问来源于stack exchange,提问作者nesh
相关产品推荐
相关产品推荐

