Quero adicionar a contagem de linhas por grupo de uma das colunas. Funciona bem com consultas regulares, mas não com paginação porque cada página inicia a contagem em 0.
Por exemplo, tenho a seguinte tabela:
id | category_id | item_id | created_at
---|-------------|---------|-----------
7 | 11 | 106 | 2024-05-06
6 | 3 | 102 | 2024-05-06
5 | 11 | 101 | 2024-05-05
4 | 9 | 98 | 2024-05-04
3 | 3 | 97 | 2024-05-03
2 | 1 | 91 | 2024-05-02
1 | 11 | 89 | 2024-05-01
E quero contar em que ordem item_id
está sua categoria até a data de criação.
Para isso estou usando a seguinte consulta:
DB::('table')->select(
table.*,
DB::raw('ROW_NUMBER() OVER(PARTITION BY category_id ORDER BY created_at) as order')
)->get();
Que é o mesmo que a seguinte consulta bruta:
SELECT table.*, ROW_NUMBER() OVER(PARTITION BY category_id ORDER BY created_at) as order
FROM table
E isso resulta em:
id | category_id | item_id | created_at | order
---|-------------|---------|------------|-------
7 | 11 | 106 | 2024-05-06 | 3
6 | 3 | 102 | 2024-05-06 | 2
5 | 11 | 101 | 2024-05-05 | 2
4 | 9 | 98 | 2024-05-04 | 1
3 | 3 | 97 | 2024-05-03 | 1
2 | 1 | 91 | 2024-05-02 | 1
1 | 11 | 89 | 2024-05-01 | 1
Mas não funcionará com paginação porque cada página tem seu próprio subconjunto e a contagem começa em outra linha, se por exemplo eu paginar a tabela acima a cada 4 resultados e terminar com 2 páginas, então a página número 2 resultaria em a seguir:
id | category_id | item_id | created_at | order
---|-------------|---------|------------|-------
7 | 11 | 106 | 2024-05-06 | 2
6 | 3 | 102 | 2024-05-06 | 1
5 | 11 | 101 | 2024-05-05 | 1
Mas eu quero que seja
id | category_id | item_id | created_at | order
---|-------------|---------|------------|-------
7 | 11 | 106 | 2024-05-06 | 3
6 | 3 | 102 | 2024-05-06 | 2
5 | 11 | 101 | 2024-05-05 | 2
Como eu posso fazer isso?
Como a paginação usando o
->paginate()
método usaLIMIT
andOFFSET
em segundo plano, não acho que você consiga.No entanto, se você não tiver dúvidas em obter todos os resultados e ENTÃO retornar apenas um subconjunto deles com paginação, você poderá fazê-lo.
Armazenar em cache os resultados da consulta também pode ajudar.