如何构建含多where、双orderBy且支持分页/限制的Eloquent查询?
修正你的Eloquent查询并解决运行问题
嘿,我来帮你把这段Eloquent查询修正到能正常运行,顺便拆解下你代码里的几个关键问题:
原代码的核心问题
- 方法名大小写错误:Eloquent的排序方法是
orderBy()(小写字母o开头),不是你写的OrderBy(),PHP是大小写敏感的,这个错误会直接导致方法不存在。 - 多字段排序写法错误:
orderBy()一次只能处理单个字段的排序规则,多个字段排序需要链式调用多次orderBy(),不能把两个字段塞进同一个方法里。 - 分页与limit冲突:
paginate(10)已经会自动处理每页显示10条数据的逻辑,不需要再额外调用limit(25)——两者同时使用会打乱分页的计算逻辑,导致结果不符合预期。 - (可选优化)如果你的
PostIco模型已经通过$table属性指定了posts表,那么->table('posts')可以省略,直接用PostIco::开头即可。
正确的代码实现
1. 分页版本(满足你要的分页需求)
$posts = PostIco::table('posts') ->where('listingType', '!=', 1) // 第一个排序字段,默认升序(ASC),如果需要降序可以加第二个参数 ->orderBy('listingType') // 第二个排序字段,这里指定降序(DESC),按需调整 ->orderBy('created_at', 'desc') // 每页显示10条,自动处理分页逻辑 ->paginate(10);
2. 限制结果总数版本(如果不需要分页,只取固定数量的结果)
如果你是想限制返回的总条数而不是分页,就用limit()配合get():
$posts = PostIco::table('posts') ->where('listingType', '!=', 1) ->orderBy('listingType') ->orderBy('created_at', 'desc') // 最多返回25条结果 ->limit(25) ->get();
3. 多Where条件扩展
如果需要添加更多where语句,直接链式追加即可,比如:
$posts = PostIco::table('posts') ->where('listingType', '!=', 1) ->where('status', '=', 'published') // 第二个where条件 ->where('view_count', '>', 50) // 第三个where条件 ->orderBy('listingType') ->orderBy('created_at', 'desc') ->paginate(10);
内容的提问来源于stack exchange,提问作者Hoxlegion
相关产品推荐
相关产品推荐

