[PROMOÇÃO] Assine com + 30% de desconto ANUAL MENSAL (últimas horas)
Rafael Lannes
Criador Rafael Lannes 12/06/2020

Opa, Carlos. Beleza?

Eu tenho um controller no laravel que faz uma requisição para uma api externa, usando o Guzle. E com esse retorno, alguns outros clientes consomem essa requisição no laravel, até aí ok.

Porém, existe a necessidade de paginar e filtrar esses dados.... a questão da paginação, até consegui usando o paginator, mas agora preciso filtrar esses dados e ficou meio complicado tratar sem o beneficio do eloquent.

Em resumo, consigo transoformar esse retorno em um model e usar os metodos do eloquent? Senão, o que você me recomenda nesses casos?

Manager Carlos Ferreira 12/06/2020

Olá, Rafael!
Blz, e com você?

Você vai precisar criar algo manual mesmo. Será necessário passar nas suas requisições com o Guzzle qual página exatamente vai precisar.

Nas suas views você cria as paginações, e passa o parâmetro "page" com o valor da página que deseja receber os resultados o no Guzzle você passa esse valor para a API retornar os próximos resultados.

Carlos Ferreira
Criador Rafael Lannes 12/06/2020

Na questão da paginação, eu consegui...

 

Agora, qual a melhor forma de fazer uma busca? A requisição me retorna um obj parecida com essa:

 

  $myArray = [

            ['id'=>1, 'title'=>'Laravel CRUD'],

            ['id'=>2, 'title'=>'Ajax CRUD'],

            ['id'=>3, 'title'=>'CORS Middleware'],

            ['id'=>10, 'title'=>'Laravel Pagination'],

        ]

Supondo que eu queira buscar pelo id e pelo titulo, não consigo fazer um orWhere, certo?

Rafael Lannes
Manager Carlos Ferreira 12/06/2020

O ideal é fazer a busca na API, passando os parâmetros que deseja.

Agora, se tem todos os dados de um array é possível converter em uma collection e aplicar os recursos de where, orWhere e etc.

https://laravel.com/docs/7.x/collections#creating-collections

Carlos Ferreira
Criador Rafael Lannes 12/06/2020

Esse projeto que estou usando está na versão 5.7 do laravel, consegui filtrar assim

$data = $collection->where('inscricao', $search);

Tentei usar o OrWhere, mas não deu certo, diz que o método não existe na classe de Collections. Uma outra solução que tentei foi essa:

 

$collection->filter(function ($value) use ($search) {

 

      return (stripos($value['inscricao'], $search) ||

        stripos($value['e_mail_solic'], $search) ||

        stripos($value['tipo_tributo'], $search) ||

        stripos($value['nome_solic'], $search));

    });

Mas não retorna nada...  tô fazendo algo errado?

Rafael Lannes
Manager Carlos Ferreira 12/06/2020

Converte o valor para minúsculo, e tente novamente (strtolower)

Carlos Ferreira
Criador Rafael Lannes 12/06/2020

dessa forma?

  return (stripos(strtolower($value['inscricao']), $search) ||

        stripos(strtolower($value['e_mail_solic']), $search) ||

        stripos(strtolower($value['tipo_tributo']), $search) ||

        stripos(strtolower($value['nome_solic']), $search));

    });

Continua o mesmo erro

 

 

 

Rafael Lannes
Manager Carlos Ferreira 12/06/2020

Você armazenou esse retorno em uma variável?

$filtered = $collection->filter(function ($value, $key) {
    // [...]
});

dd($filtered->all());

Carlos Ferreira
Criador Rafael Lannes 12/06/2020

Não tinha feito isso antes, mas acontece a mesma coisa. Retorna vazio:

    $search = '928121';

    $filtered = $collection->filter(function ($value) use ($search) {

 

      return (stripos(strtolower($value['inscricao']), $search) ||

 

        stripos(strtolower($value['e_mail_solic']), $search) ||

        stripos(strtolower($value['tipo_tributo']), $search) ||

       stripos(strtolower($value['nome_solic']), $search));

    });

 

    dd($filtered->all());

--------------------------------------------------------------------------------

Quando eu coloco um dd em cima do return, ele retorna um objeto que está certo, mas em qualquer linha abaixo é nulo

$filtered = $collection->filter(function ($value) use ($search) {

      dd($value);

      return (stripos(strtolower($value['inscricao']), $search) ||

 

        stripos(strtolower($value['e_mail_solic']), $search) ||

 

        stripos(strtolower($value['tipo_tributo']), $search) ||

 

        stripos(strtolower($value['nome_solic']), $search));

    });

Rafael Lannes
Manager Carlos Ferreira 12/06/2020

Utilizando o método where não foi?
https://laravel.com/docs/7.x/collections#method-where

Compartilha comigo o código fonte, no GitHub.

Carlos Ferreira
Sabe a Solução? Ajude a resolver!

Precisa estar logado para conseguir responder a este ticket!

Clique Aqui Para Entrar!