Closed alissonpeloso closed 1 year ago
@gustavoSutil como está indo com a tarefa? se precisar de algo pode me chamar ou postar aqui.
@gustavoSutil
Eu percebi que você havia tentado fazer uma nova busca na função que filtra as datas, mas na verdade se fizermos dessa forma, os outros filtros seriam desconsiderados, por isso é feito a busca de todos os dados na linha 124 e depois são aplicados os filtros e ordenações.
Precisa haver alguma forma de filtrar as datas dos comentários diretamente na query já montada, algo parecido com isso: (adicionei o 'comments.created_at', porém assim não está funcionando mas precisa ser algo parecido com isto)
Para resolver o problema, dentro do model orders tentei acessar o atributo que relacionava o objeto com comments nesse trecho de código, da mesma forma que estava feito, com order by:
Para isso primeiro criei uma variável para servir no liveware:
public array $sort_by_date;
Depois criei a parte do front, que ficou assim:
As opções de ordenação foram:
Por fim alterei a função findOrders criando mais uma função:
O resultado foi esse:
Porém quando alteramos para ordenar por último comentário, aparece o erro:
Illuminate\Database\QueryException
SQLSTATE[HY000]: General error: 1 no such column: comments.created_at (SQL: select from "orders" order by "comments"."created_at" desc limit 50 offset 0)
Isso porque o order by vai procurar um atributo com esse nome, ele não existe ainda. Ele só vai ser criado após essa linha:
$this->orders = $query->paginate($this->paginationAmount);
que vai se transformar em uma collection após a consulta.
Com essa linha:
$this->orders = $query->paginate($this->paginationAmount); dd($this->orders);
o resultado será esse:
repare que dentro de items, relations existe outra collection comments.
colocando isso no dd (no caso irei colocar o primeiro resultado da pagina-index 0):
dd($this->orders[0]['comments']);
temos:
que são os comentários feitos na order de index 0.
Com isso é possível concluir que:
-Não é possível acessá-los com o order by pois ele não entra no escopo do SQL.
Para conseguir fazer orders se relacionar com os comments é necessário criar um join, escolhi o left join. E ficou assim:
E então os cards ficaram ordenados por ordem de criação, o único problema é que para cada comentário criou-se um card de pedido, assim o-fazendos duplicados no caso de mais de um pedido.
Isso poderia ser resolvido com uma subquery SQL,exemplo:
`SELECT
orders.,
comments.commentable_id AS id_c,
comments.created_at AS commentable_created
FROM
orders LEFT JOIN comments
WHERE id_c = orders.id
AND NOT EXISTS(
SELECT comments.*
FROM comments
WHERE comments.commentable_id = id_c
AND
commentable_created > comments.created_at
);`
Porém não consegui fazer com as ferramentas do eloquent, ficando então, com os pedidos repetidos na view.
A ideia dessa tarefa é possibilitar que os serviços do painel de administração do mural permitam que as solicitações sejam dispostas na ordem cronológica de criação ou de interação:
Assim, é possível visualizar as mais recentes. Acho que poderia ser aplicado como a visualização de um filtro nas planilhas do google ou excel.