practice-uffs / mural

Sistema para coleta de sugestões, ideias e críticas relacionadas ao projeto.
Apache License 2.0
11 stars 14 forks source link

Criar filtros para a visualização das solicitações por ordem cronológica #519

Closed alissonpeloso closed 1 year ago

alissonpeloso commented 2 years ago

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:

image

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.

zorteaadriano commented 1 year ago

@gustavoSutil como está indo com a tarefa? se precisar de algo pode me chamar ou postar aqui.

zorteaadriano commented 1 year ago

@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)

image

gustavoSutil commented 1 year ago

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: image 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: image As opções de ordenação foram: image Por fim alterei a função findOrders criando mais uma função: image O resultado foi esse: Captura de tela de 2023-01-03 10-14-06 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: image 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: image 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: image 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.