Entenda de uma vez por todas as laravel collections

O que é Laravel Collections?

Você pode nunca ter ouvido da Laravel Collections caso você esteja começando a utilizar Laravel agora, mas muito provavelmente você já as usou. Basicamente é um array super turbinado, uma abstração criada pelo Laravel para facilitar sua vida quando o assunto é trabalhar com um conjunto de dados.

Se você já sabe disso tudo e é um pouco mais experiente que isso você não deveria estar aqui. Vá se divertir lendo a documentação oficial diretamente.

Caso você ainda é um iniciante e acha essa coisa de ler documentação ainda complicada, espero conseguir deixar as coisas menos obscuras nesse post.

Por onde eu começo?

Para começar a trabalhar com collections é muito simples, você provavelmente já as utilizou quando executou algo do Builder com o método get(). Mesmo quando nada é retornado da sua query, o retorno do método get() é uma Collection.

Caso esteja interessado em criar sua própria Collection, você pode usar o método helper collect() que recebe um array como parametro e o transforma num objeto da classe Collection, como a baixo:

collect(['blabla'=>'blabla', 'testando', 'testando 2'])

Perceba que o resultado foi algo do tipo:

Illuminate\Support\Collection {#1201
     all: [
       "blabla" => "blabla",
       0 => "testando",
       1 => "testando 2",
     ],
}

Primeira coisa a ser notada aqui é que o método collect() é inteligente o suficiente para trabalhar com um array associativo e com arrays comuns. Caso estranhe o output que eu colei aqui é porque você ainda não conhece o tinker. Para utiliza-lo basta ir no terminal, na pasta root do seu projeto e digitar:

php artisan tinker

A mágica acontecendo

Agora que você já foi apresentando ao tinker e já sabe como iniciar seu objeto Collection, vamos dar uma olhada na mágica que o Laravel preparou para nós.

Uma informação útil para quem está começando com PHP e/ou Laravel é entender que quase todos os métodos dos objetos do tipo Collection são encadeados, o que isso quer dizer? Isso quer dizer que eles retornam também objetos do tipo Collection, o que te dar liberdade para fazer coisas desse tipo:

collect([1,2,3,4,5])->reverse()->slice(2);

Você entendeu? Primeiro criamos uma collection com os algorismo de 1 à 5, depois invertemos essa ordem e por fim tomamos os 2 primeiros números para fora da collection (5 e 4, respectivamente).

O interessante aqui é notar o poder e a capacidade de simplificar código que os chained methods dão para os desenvolvedores. O código fica bastante elegante não?

Os muitos truques de mágica

Ok, você entendeu o quão legal são as collections e conheceu dois métodos legais. Agora precisamos falar um pouco sobre os outros métodos.

all()

O método all() retorna um array com cada item da sua collection, é basicamente o processo inverso da função helper collect():

collect([1,2,3,4,5])->all();

O retorno será o array [1,2,3,4,5]

avg()

O método avg, que é uma abreviação de average retorna a média. Caso sua Collection seja composta de números o retorno será diretamente a média entre eles:

collect([1,2,3,4,5])->all();

Retornará 3.

Caso você esteja trabalhar com uma collection de objetos ou arrays associativos você deve especificar qual a propriedade que você quer tirar a média:

collect([
        ['name'=>'Marco', 'age'=>25],
        ['name'=>'John Doe', 'age'=>50]
])->avg('age');

Irá retornar 37.5.

collapse()

O método collapse une um conjunto de arrays em apenas uma collection:

    collect([[1,2],[3,4],[5,6]])->collapse()->all();

Teremos como resultado final o array [1,2,3,4,5,6]

contains()

Esse é um dos métodos mais úteis na minha opinião, com ele você pode verificar se um determinado valor ou conjunto valor e chave existe em uma collection:

    $collection = collect(['name' => 'Marco', 'age' => 25]);
    $collection->contains('Marco');

Isso retornará o booleano true. Caso eu tente algo como:

    $collection = collect([
        ['name' => 'Marco', 'age' => 25]
    ]);
    $collection->contains('John Doe');

Eu terei de retorno o booleano false, pois John Doe não encontra-se no meu array.

Posso passar como parametro do método contains() também o conjunto chave e valor:

    $collection = collect([
        ['name' => 'Marco', 'age' =>25],
        ['name' => 'John Doe', 'age' =>50],
    ]);
    $collection->contains('age',25);

Isso retornará true, pois existe um array com a posição ‘age’ e o valor 25.

Por fim, mas não menos importante, podemos criar nosso próprio callback na chamada do método e fazer um teste mais complexo:

    $collection = collect([
        ['name' => 'Marco', 'age' =>25],
        ['name' => 'John Doe', 'age' =>50],
        ['name' => 'Foo', 'age' =>60],
    ]);
    $collection->contains(function($key,$value){
        return $value['age'] >= 60;
    });

OBS: Se você estiver usando a versão 5.3 do Laravel, você deve inverter a ordem da $key e $value para todos os métodos que passam funções de callback como parâmetro.

function($value,$key) 

Retornará true, pois existe um elemento em que a propriedade age é maior ou igual a 60.

count()

Retorna a quantidade de itens na collection:

collect([1,2,3,4,5])->count();

retorna 5.

first()

Retorna o primeiro elemento que passe no teste da callback, caso não seja passado nenhuma callback como parâmetro o método retorna o primeiro item da collection.

    collect([1, 2, 3, 4, 5, 6])->first(function ($key, $value) {
        return $value > 3;
    });

O retorno será o numero 4, na posição 3 do vetor.

Caso não seja passado função:

    collect([1, 2, 3, 4, 5, 6])->first();

O retorno será 1, na posição 0 do vetor.

last()

Retorna a último elemento para um teste em forma de callback, caso nada seja passado ele retornará o último elemento da collection:

    collect([1, 2, 3, 4])->last(function ($key, $value) {
        return $value < 3;
    });

Retornará 2, pois é o último valor menor que 3 da collection.

Caso nada seja passado como parâmetro:

    collect([1, 2, 3, 4])->last();

O retorno será 4, que é o último valor da collection.

isEmpty()

Verifica se a collection está vazia.

    collect([])->isEmpty();

Vai retornar true, pois a collection está vazia.

Concluindo

Você aprendeu alguns dos métodos mais importantes e usados das collections, mas ainda precisa se aprofundar mais e conhecer o restante dos métodos. Não existe forma melhor de conseguir ambas as coisas do que uma boa lida na documentação que pode ser encontrada no inicio desse artigo. Espero ter ajudado.

Gostou? Tem uma sugestão ou crítica? Deixe um comentário abaixo.

DEIXE UMA RESPOSTA

Please enter your comment!
Please enter your name here