آموزش کامل Collection در لاراول

دسته بندی: برنامه نویسی
سطح مقاله: متوسط
زمان مطالعه: 12 دقیقه
۰۱ تیر ۱۳۹۸
فارسی
کالکشن
English
Collection

تا به حال در هنگام کار کردن با لاراول با خطایی که به شما گوشزد می کند در حال کار کردن روی یک Collection به جای آرایه هستید مواجه شده اید؟ اما این Collection چیست؟ Collection یکی از قدرتمندترین امکاناتی است که لاراول در اختیار شما قرار می دهد! واقعیت این است که اگر با ماهیت Collection ها در لاراول آشنایی نداشته باشید، احتمالا در هنگام کار کردن با الوکوئنت (Eloquent) لاراول حسابی درگیر و عصبی می شوید! این مقاله به معرفی Collection در لاراول و آموزش کار با آن اختصاص دارد. در پایان این مقاله شما می توانید به راحتی این نوع داده ای لاراول را بشناسید و با آن کار کنید.

فهرست محتوای این مقاله

Collection در لاراول چیست

Collection چیست

در لاراول توسط کلاس Illuminate\Support\Collection یک نوع داده ای جدید تعریف شده است که در واقع یک پوشش برای آرایه ها است. کار این پوشش در حقیقت اضافه کردن به قابلیت های آرایه ها و ساده و سریع تر کردن کار با آن ها است. در حقیقت Collection همان آرایه است، اما خیلی بهتر از آن!!!

ایجاد یک Collection در لاراول

برای ساخت یک Collection در لاراول دو راه پیش روی شما قرار دارد. در روش اول می توانید یک نمونه یا instance جدید از کلاس Illuminate\Support\Collection را به صورت دستی ایجاد کنید. کد زیر پیاده سازی این روش را نشان می دهد:

namespace app\Http\Controllers;
use Illuminate\Support\Collection;

class TestController extends Controller
{
    /**
     * Create a new collection with a Collection class instance.
     */

    public function createCollectionWithClass()
    {
        $newCollection = new Collection([1, 2, 3, 4, 5]);
        dd($newCollection);
    }
}

همانطور که می بینید در این کد ابتدا Illuminate\Support\Collection را use کرده و سپس به سادگی با کلیدواژه new یک نمونه جدید از کلاس Collection ساختیم. اما برای ساخت کالکشن یک روش ساده تر نیز وجود دارد. روش دوم این است که از متد کمکی (helper) آماده لاراول با نام collect() برای این کار استفاده کنیم. به کد زیر دقت کنید:

namespace app\Http\Controllers;
use Illuminate\Support\Collection;

class TestController extends Controller
{
    /**
     * Create a new collection using the collect helper method.
     */

    public function createCollectionWithHelper()
    {
        $newCollection = collect([1, 2, 3, 4, 5]);
        dd($newCollection);
    }
}

در این روش هم دقیقا مانند روش قبل ابتدا کلاس Collection را use کردیم و سپس آرایه مورد نظرمان را به عنوان آرگومان به متد collect() دادیم. اما سوال این است که از کدام یک از این روش ها برای ساختن کالکشن استفاده کنیم؟ از هرکدام که دلتان خواست! اما به هر حال استفاده از متد آماده collect() به نظر کوتاه تر و ساده تر است.

به هر حال نتیجه هر دو روش یکی است. در هر دو حالت از متد کمکی dd() یا die and dump لاراول برای نمایش محتویات کالکشن استفاده کردیم و نتیجه در مرورگر برای هر دو چنین چیزی است:

Collection چیست

 Collection ها در الوکوئنت ORM

همانطور که در اول این مقاله گفتیم کالکشن ها در الوکوئنت نقش بسیار پر رنگی را ایفا می کنند! الوکوئنت اطلاعات را در قالب کالکشن ارائه می دهد. به عنوان نمونه مثالی برایتان می زنیم. فرض کنید یک جدول به نام users به علاوه مدل User داریم. در آن صورت می توانیم توسط کد زیر اطلاعات جدول users را از طریق الوکوئنت برگردانیم:

   /**
     * Get a list of users from the users table
     */

    public function getUsers()
    {
        $users = User::all();
        dd($users);
    }

 این کد یک کالکشن حاوی اطلاعات تمام کاربران یا user ها را در خروجی به ما نمایش می دهد. در مثال بالا می توانیم به راحتی با استفاده از کالکشن ها با آرایه مانند آبجکت برخورد کنیم و به راحتی به تمام اتریبیوت های (Attribute) آن به صورت زیر دسترسی داشته باشیم:

/**     
  * Get the name of the first user     
  */    

  public function firstUser()    
  {        
      $user = User::first();        
      dd($user->name);    
  }

 معرفی توابع پرکاربرد Collection

اما چرا گفتیم که کالکشن ها کار ما را راحت می کنند؟ کالکشن در لاراول متدهای کمکی بسیار زیادی دارد که ما را از نوشتن ده ها خط کد اضافه معاف می کند! در این بخش به معرفی بعضی از این متدها و کاربرد های آن ها می پردازیم.

پیدا کردن اطلاعات در Collection

کالکشن متدهای زیادی را برای پیدا کردن دیتای مورد نظرتان به اشکال مختلف در اختیارتان قرار می دهد. در ادامه با دو روش پیدا کردن دیتا در کالکشن ها آشنا می شوید.

استفاده از  Contains

متد contains() در لاراول می تواند به راحتی به شما بگوید که دیتایی که به دنبال آن هستید در کالکشن موجود هست یا خیر. اما با استفاده از این متد می توانید به دنبال چه چیزهایی بگردید؟ ورودی ها این متد می تواند از انواع مختلفی مانند یک مقدار معمولی مثل string، یک جفت key-value و یا حتی یک فانکشن از نوع callback باشد. مقدار برگشتی این متد یک مقدار Boolean است. زمانی که مقدار در کالکشن موجود باشد contains() مقدار true و در غیر این صورت false بر می گرداند.

مثال های زیر طریقه استفاده از متد contains() با هر نوع از مقادیر ورودی را نمایش می دهد:

/**
     * Check if a collection contains a given key value pair
     * value or callback parameter
     *
     * @return true or false
     */

    public function contains()
    {
        $users = User::all();

        $users->contains('name', 'Chasity Tillman');
        //true

        $collection = collect(['name' => 'John', 'age' => 23]);

        $collection->contains('Jane');
        //false

        $collection = collect([1, 2, 3, 4, 5]);

        $collection->contains(function ($key, $value) {
            return $value <= 5;
            //true
        });

    }

 استفاده از Where

با استفاده از متد where() می توانید تعدادی از آیتم های collection را گزینش کنید.این متد یک جفت مقدار key و value را به عنوان ورودی دریافت می کند و بر اساس آن آیتم های مورد نظرتان را در کالکشن برایتان پیدا می کند. به مثال زیر دقت کنید:

/**
     * Use the where method to find data that matches a given
     * criteria.
     *
     * Chain the methods for fine-tuned criteria
     */

    public function where()
    {
        $users = User::all();

        $user = $users->where('id', 2);
        //Collection of user with an ID of 2

        $user = $users->where('id', 1)
                      ->where('age', '51')
                      ->where('name', 'Chasity Tillman');
        //collection of user with an id of 1, age 51
        //and named Chasity Tillman
    }

 همانطور که در مثال بالا مشاهده می کنید، شما می توانید به روش Method Chaining با متد where() کار کنید. با این امکان می توانید به راحتی شرط های مختلفی را روی where() پیاده کنید.

مرتب سازی اطلاعات در Collection

تصور کنید که بتوانید به راحتی و یک خط کن تمام اطلاعات آرایه تان را مرتب کنید! در واقع این اتفاقی است که در پوشش کالکشن ها می افتد. برای مرتب سازی یا sort کردن آیتم ها در کالکشن دو متد وجود دارد:

  • sortBy(): می توانید با استفاده از این متد آیتم ها را بر اساس اولویتی که می دهید به صورت صعودی مرتب کنید
  • sortByDesc(): می توانید با استفاده از این متد آیتم ها را بر اساس اولویتی که می دهید به صورت نزولی مرتب کنید

هر دوی این متدها یک کلید یا فانکشن callback را به عنوان اولویت، از شما می گیرند و کالکشن مورد نظرتان را مرتب سازی می کنند. به مثال های زیر توجه کنید:

    /**
     * The sort methods takes a key or callback function parameter
     * which is used to sort a collection.
     */

    public function sortData()
    {
        $users  = User::all();

        $youngestToOldest = $users->sortBy('age');
        $youngestToOldest->all();
        //list of all users from youngest to oldest

        $movies = collect([
            [
                'name' => 'Back To The Future',
                'releases' => [1985, 1989, 1990]
            ],
            [
                'name' => 'Fast and Furious',
                'releases' => [2001, 2003, 2006, 2009, 2011, 2013, 2015, 2017]
            ],
            [
                'name' => 'Speed',
                'releases' => [1994]
            ]
        ]);

        $mostReleases = $movies->sortByDesc(function ($movie, $key) {
            return count($movie['releases']);
        });
        $mostReleases->toArray();
        //list of movies in descending order of most releases.

        dd($mostReleases->values()->toArray());
        /*
            list of movies in descending order of most releases
            but with the key values reset
        */
    }

در کد بالا دیدید که از متدی با نام values استفاده کردیم. متدهای sort، خود کلیدهای کالکشن را مدیریت می کند اما با این حال ممکن است بخواهید پس از مرتب سازی کلیدها را دوباره از صفر بچینید. مثال پایین این موضوع را کاملا به شما نشان می دهد:

$collection = collect([
        10 => ['product' => 'Desk', 'price' => 200],
        11 => ['product' => 'Desk', 'price' => 200]
    ]);

    $values = $collection->values();
    $values->all();
    /*
        [
            0 => ['product' => 'Desk', 'price' => 200],
            1 => ['product' => 'Desk', 'price' => 200],
        ]
    */

 جمع بندی

لاراول دارای یک کلاس قدرتمند برای بالا بردن کارایی آرایه ها وساده تر کردن کار با آن هاست. در این مقاله به معرفی و آموزش استفاده از این ابزار قدرتمند که Collection نام دارد پرداختیم. همچنین چندین متد برای راحتی کار با آرایه ها را که در Collection تعریف شده است بر شمردیم. البته باید بدانید که این تنها بخش کوچکی از تعداد بالای متدهای کاربردی Collection است. از تجربه کار با Collection ها چه برای گفتن دارید؟ منتظر دیدگاه های ارزشمند شما در بخش نظرات هستیم.

اگر می خواهید بیشتر در مورد لاراول مطالعه کنید مقالات زیر را دنبال کنید

 

نویسنده

نظرات کاربران

اولین دیدگاه این پست رو تو بنویس !

ارسال دیدگاه
خوشحال میشیم دیدگاه و یا تجربیات خودتون رو با ما در میون بذارید :

 
گزارش مشکل