我有一个帖子模型,我正在尝试->paginate()
,->groupBy()
和->orderBy()
。
public function index()
{
$posts = Post::where('verified', '1')
->orderBy('created_at','desc')
->groupBy('topic', 'publisher_id')
->paginate(5);
// dd($posts);
}
同时,数据库中的数据如下所示:
| id | verified | topic | publisher_id | body | created_at |
| 25 | 1 | Forest | 3 | EE | 10.12.50 |
| 24 | 1 | Forest | 3 | DD | 10.11.40 |
| 23 | 1 | Forest | 3 | CC | 10.10.30 |
| 22 | 1 | Dance | 2 | BB | 9.50.50 |
| 21 | 1 | Dance | 2 | AA | 9.40.40 |
| 20 | 1 | Music | 1 | ZZ | 9.30.30 |
| 19 | 1 | Music | 1 | XX | 9.20.20 |
| 18 | 1 | Art | 1 | YY | 9.10.10 |
| 17 | 1 | Art | 1 | WW | 9.00.00 |
| 16 | 1 | Ski | 2 | KK | 7.00.00 |
当我取消注释dd()
并运行代码时,我得到了这个日志:
LengthAwarePaginator {
...
items : {
items : {
0 => Post{..}
1 => Post{..}
2 => Post{..}
3 => Post{..}
...
}
}
...
}
0 => Post{#249} : "published_by: "3", "body": "CC", "created_at": "10.10.30"
1 => Post{#250} : "published_by: "1", "body": "XX", "created_at": "9.20.20"
2 => Post{#251} : "published_by: "1", "body": "WW", "created_at": "9.00.00"
3 => Post{#252} : "published_by: "2", "body": "KK", "created_at": "7.00.00"
出于某种原因看起来很奇怪。它为用户3做了groupBy
,但对其他用户做不到。此外,它最早创造的是最早创造的而不是最新的。将desc
改为asc
就像->orderBy('created_at', 'asc')
一样,会使一切完全脱离正轨。
换句话说,返回'CC' for user-3, Forest
而不是'EE' for user-3, Forest
然后我想也许是->paginate(5)
弄乱的事情。
public function post()
{
$posts = Post::where...
...
->paginate(5);
$postsTry = Post::where('verified', '1')
->orderBy('created_at','desc')
->groupBy('topic', 'publisher_id')
->get();
// dd($postsTry);
}
我收到一个只包含items
上述对象的集合。
(0 => Post{..}, 1 => Post{..}, 2 => Post{..}
)。
它将数据分组为最早的而不是最新的。我缺少什么?我做错了什么?
总结一下,请注意我想要的是:
'EE' for user-3, Forest
'BB' for user-2, Dance
'ZZ' for user-1, Music
'YY' for user-1, Art
答案 0 :(得分:3)
删除了我之前的回答但仍会包含Laravel Pagination关于将groupBy()
与paginate()
联系起来的说明。
注意:目前,Laravel无法有效执行使用
groupBy
语句的分页操作。如果您需要将groupBy
与分页结果集一起使用,建议您查询数据库并手动创建分页器。
<强>更新强>
由于created_at
字段的日期格式异常,您需要整数cast
ed值才能正确使用order by
语句(作为整数,不是一个字符串)。这是一个有效的例子:
Post::selectRaw("*, CAST(REPLACE(created_at, '.', '') AS UNSIGNED INTEGER) ca")
->where('verified', '1')
->orderBy('ca', 'desc')
->groupBy('topic', 'publisher_id')
->paginate();
答案 1 :(得分:0)
您需要使用子查询(或其他连接方法)来获取组中的顶级项目。见Getting The Rows Holding the Group-wise Maximum of a Certain Column
删除了我的示例。