آشنایی با eloquent collections

اصول آموزش Laravel

تاریخ : جمعه 29 دی 1396

تمامی مجموعه های چند نتیجه ای که در خروجی کوئری های Eloquent دریافت می کنیم، در واقع نمونه ای از شیIlluminate\Database\Eloquent\Collection هستند. نتایج واکشی شده توسط متد get یا رابطه ها (relationship method) نیز از این قاعده مستثنی نیستند. شی نام برده کلاس پایه ی (base) collection لاراول را به ارث می برد. بنابراین تمامی توابعی که برای کار با Eloquentاستفاده می شوند نیز به ارث برده می شوند.

می توان در تمامی collection ها مانند آرایه حلقه زد (collection ها قابل iterate هستند).

$users = App\User::where('active', 1)->get();

foreach ($users as $user) {
    echo $user->name;
}

البته collection ها بسیار قدرتمندتر از آرایه ها هستند و می توان از آن ها برای عملیات نگاشت / سازماندهی و کاهش (map/reduce) بهره گرفت. این عملیات را می توان از طریق یک رابط (intuitive interface) مانند زنجیر به هم متصل کرد. در نمونه ی زیر تمامی مدل های غیرفعال را حذف کرده و اسم تمامی کاربران باقی مانده را بیرون می کشیم:

$users = App\User::all();

$names = $users->reject(function ($user) {
    return $user->active === false;
})
->map(function ($user) {
    return $user->name;
});
بیشتر توابع collection در Eloquent یک نمونه ی جدید از collection در خروجی برمی گردانند، این درحالی است که متدهایpluck، keys، zip، collapse، flatten و flip یک نمونه از collection پایه را به عنوان نتیجه برمی گردانند.


کلاس پایه ی collection

تمامی collection های Eloquent شی پایه ی collection لاراول را به ارث می برند. از این رو، تمامی متدهای قدرتمند این کلاس نیز در اختیار کالکشن ها قرار می گیرد:


ایجاد collection های اختصاصی

چنانچه لازم است از یک شی Collection سفارشی به همراه متدهای الحاقی (extension method) خود استفاده کنید، در آن صورت می توانید متدnewCollection را در مدل بازنویسی (override) نمایید:

<?php

namespace App;

use App\CustomCollection;
use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    /**
     * Create a new Eloquent Collection instance.
     *
     * @param  array  $models
     * @return \Illuminate\Database\Eloquent\Collection
     */
    public function newCollection(array $models = [])
    {
        return new CustomCollection($models);
    }
}

پس از اینکه متد newCollection را تعریف کردید، هر بار که Eloquent یک نمونه Collection از مدل مربوطه را برمی گرداند به همراش نمونه ای از collection سفارشی خود را در خروجی دریافت می کنید. اگر می خواهید به ازای هر مدل در اپلیکیشن خود یک collection سفارشی استفاده کنید، در آن صورت می بایست متد newCollection را بر روی کلاس مدل پایه که توسط تمامی مدل های برنامه به ارث برده می شود، بازنویسی نمایید.


منابع مورد مطالعه جهت جمع آوری این مطلب:
https://laravel.com/docs/5.5/eloquent-collections
www.tahlildadeh.com/ArticleDetails/آموزش-collection-در-Laravel


نظرات