Skip to main content

Mostly use of collection methods in laravel

Example code here.

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Support\Str;
class CollectionController extends Controller
{
    const PROJECT_TYPES = [
        'action',
        'base resource',
        'A W S',
        'lara beans'
    ];

    const MOVIES_TYPES = [
        ['id'=>1,'name'=>'action'],
        ['id'=>2,'name'=>'base resource'],
        ['id'=>3,'name'=>'A W S'],
        ['id'=>4,'name'=>'lara beans']
    ];
    function mapWithSlugs() {
        dump('Convert name of arrays into slug using Slug function and iterate array
with map function');
        $slugs = [];
        foreach(self::PROJECT_TYPES as $name){
            $slugs[] = Str::slug($name);
        }

        return $slugs;

        return collect(self::PROJECT_TYPES)->map(function ($name) {
            return 'ESE_'.Str::slug($name);
        })->toArray();
    }

    function mapWithKeys() {
        dump('Convert value of arrays into keys. And also make other index value
to someother key value using mapWithKeys method, Note: it will return us object');
        return collect(self::MOVIES_TYPES)
        ->mapWithKeys(function ($name) {
            return [$name['id'] => Str::slug($name['name'])];
        })->toArray();

        //output : {"1":"action","2":"base-resource","3":"a-w-s","4":"lara-beans"}
    }

    function eachMethod(){
        dump("This is seeder example where we can create 'users' than for each other
create 'listing' than assign/attach these listing with 'tags'.");
        $tags = Tag::factory(20)->create();

        User::factory(10)->create()->each(function ($user) use($tags) {
            Listing::factory(rand(1,4)->create([
                'user_id' => $user->id
            ]))->each(function ($listing) use($tags) {
                $listing->tags()->attach($tags->random(2));
            });
        });
    }

    function pushMethod(){
        $old_movies = self::MOVIES_TYPES;
        $new_movies = collect();

        collect($old_movies)->map(function($old_movies) use($new_movies) {
            $new_movies->push($old_movies['name']);
        });

        return $new_movies[2];
    }

    function filterMethod() {
        $collection = collect([
            ['name'=>'adnan','age'=>18],
            ['name'=>'zaib','age'=>20],
            ['name'=>'arsalan','age'=>12],
            ['name'=>'rao','age'=>11]
        ]);

        $filtered = $collection->filter(function ($name) {
            return substr($name['name'], 0,1) == 'A' || substr($name['name'], 0,1) == 'a' && $name['age'] >= 18;

        });
        // to json
        return $filtered->values()->all();
    }

    function pluckMethod() {
        $collection = collect([
            ['name'=>'adnan','age'=>18],
            ['name'=>'zaib','age'=>20],
            ['name'=>'arsalan','age'=>12],
            ['name'=>'rao','age'=>11]
        ]);

        $filtered = $collection->pluck('name');
        // to json
        return $filtered->values()->all();
    }

    function containMethod() {
        dump("contains method work similar to filter method but it return ");
        // with simple array
        // $collection = collect([
        //  'adnan',
        //  'zaib',
        //  'arsalan',
        //  'rao'
        // ]);
        // with nested associative array.
         $collection = collect([
            ['name'=>'adnan','age'=>18],
            ['name'=>'zaib','age'=>20],
            ['name'=>'arsalan','age'=>12],
            ['name'=>'rao','age'=>11]
        ]);

        $contains = $collection->contains(function ($item) {
            return substr($item['name'], 0,1) == 'b';
        });
        // to json
        return $contains ? 'array contains' : 'array does not contain';
    }

    function partitionMethod() {
        dump("This method much like with filter and contains. It uses closure
function containing the current item in the array.");
        dump("Using this we get two array of data. One array is the output of
our condition(login) and second array is the reverse the condition(login");

        $collection = collect([
            'adnan',
            'zaib',
            'arsalan',
            'rao'
        ]);

        [$aboveFive, $underFive] = $collection->partition(function($item) {
            return strlen($item) > 5;
        });

        // return $aboveFive;
        return $underFive->values()->all();

        // output : ["adnan","zaib","rao"]
    }

    function eachMethod2(){
        $collection = collect([
            ['banana',23,'lahore'],
            ['apple',56,'kashmir'],
            ['sugar cane',20,'pindi']
        ]);

        $collection->each(function($value) {
            dump("We have {$value[1]} {$value[0]} in our store {$value[2]}.");
        });

         dump("Note: problem is that it is dificult to determine which index
contain which value.to solve that issue we have eachSpread method.");

        $collection->eachSpread(function($product,$qty,$location) {
            dump("We have {$qty} {$product} in our store {$location}.");
        });
    }

} 


Some other useful method use to manipulate the data of the collection.

1. each method

$users = \App\User::get();
    // for each loop mostly use to modify data on each iteration
    // each method return us whole collection
    $output = $users->each(function($user){
        $user->isActive = rand(0,1);
        $user->year = date('Y');
        unset($user->updated_at);
    });
    dd($output);

2. filter method

filter method condtionally work, mean based on condition it return data.

$users = \App\User::get();
    $output = $users->filter(function($user){
        return $user->id < 5;
    });
    dd($output->toArray());

toArray() method will convert the eloquant modal data into array data.

3. search method

This method return the index number, position of fata inside the collection array.

$users = \App\User::get();
    // search method on array
    $list = $users->pluck('email');
    $output = $list->search('asdnanzaib486@gmail.com');
    dd($output);

Note: all() method convert data / return data in array. collection method aply on collections record.

Comments