تعداد بازدید: 832

Eloquent Collections

Eloquent Collection یک Collection است که از مدل هایی که بر اساس Eloquent ORM طراحی شده اند بر می گردد. هر Collection یک شئ پیشرفته است حاوی یک سری داده و یک سری عملگر که داده ها را به عنوان ورودی می گیرد.

Laravel Basic Collection

Collection یک کلاس در مسیر Illuminate\Support\Collection می باشد که بوسیله آن می توانید یک جریانی از یک سری متد را روی آرایه ای از انواع داده (داده های خام مثل عدد ، رشته یا شئ های Eloquent model) پیاده سازی کنید. به عبارت دیگر method chaining روی آرایه ورودی آن (متد constructor).

$collection = collect(['taylor', 'abigail', null])->map(function ($name) {
    return strtoupper($name);
})
->reject(function ($name) {
    return empty($name);
});

با استفاده از تابع کمکی collect می توانیم یک Collection بسازیم. حالا آن جریان متد ها را روی آرایه ای از داده های ورودی راه اندازی می کنیم. ابتدا نام تمامی اعضا را uppercase می کنیم و بعد مقادیر خالی را reject می کنیم و نتیجه را باز می گردانیم که مقدار زیر است :

['TAYLOR', 'ABIGAIL']

مراحل ایجاد یک Collection به شرح زیر می باشد :

creating collection

شما یا collection رو می سازید (بوسیله تابع کمکی collect) یا با استفاده از query هایی که از Eloquent میاد می گیریدش.

$collection = collect(["a"=>1, "b"=>2, "c"=>3]);
# Eloquent Query
$collection = User::where('name','Abolfazl')->get();

♣ Available Methods

هر شئ از کلاس Collection یک سری متد برای اعمال تغییرات روی داده های پایه (underlying data) و خروجی مطلوب برگرداند.اکثر این متد ها خروجی یک شئ جدید از Collection دارند ، به همین دلیل این متد ها را می توان به صورت یک جریان به هم متصل کرد (chained to fluently).

برخی از پر کاربرد ترین متد های Basic Collection :

all : تمامی آرایه پایه را بر می گرداند ، حال این که آرایه پایه از چه چنسی باشد. متد get با استفاده از کلید مقدار را بر می گرداند.first مورد اول و last مورد آخر را بر می گرداند.

toArray : این متد خروجی داده های پایه را به صورت آرایه بر می گرداند. دقت داشته باشید این متد چون خروجی آرایه است دیگر امکان زنجیر کردن متد دیگری به آن نیست و جمله متد های پایانی است.

only : مجموعه collection را با کلید های خاص بر می گرداند. متد except تمامی متد ها غیر از موارد ورودی را بر می گرداند.

take : این متد یک Collection با تعداد اعضای محدود شده بر می گرداند. ورودی این متد یک عدد است که اگر مثبت باشد از ابتدا مشمرد و بر میگرداند و اگر منفی باشد از انتها می شمارد.این متد از array_slice استفاده می کند.

chunk : این متد یک collection را به صورت چند آرایه کوچکتر از سایز داده شده به عنوان ورودی بر می گرداند. این متد از array_chunk استفاده می کند. این متد زمانی که می خواهیم خروجی ها را به صورت یک گرید های بوتسترپ نمایش دهیم پر کاربرد است.

@foreach ($products->chunk(3) as $chunk)
    <div class="row">
        @foreach ($chunk as $product)
            <div class="col-xs-4">{{ $product->name }}</div>
        @endforeach
    </div>
@endforeach

where : یک شرط روی داده های پایه اجرا می کند. معادل عملگر = می باشد. مثلا نام = ali

whereIn : یک شرط روی داده های پایه اجرا می کند و معادل عملگر IN می باشد.مثلا id IN [1,2,3]

whereNotIn : یک شرط روی داده های پایه اجرا می کند و معادل عملگر NOT IN می باشد.

نکته : چون عملگر های بالا یک شرط را اجرا می کنند می توان چند عملگر where را به هم زنجیر کرد و فی الواقع تمامی شرط ها AND شده اند.

contains : این که در Collection جاری مقداری به ازای کلید خاص موجود است یا خیر.

@foreach($products as $product)
<select name="category" >
    <option value="{{$product->id}}"
         @if ($product->contains('id',1))
	      select=""
	 @endif
	 >{{$product->name}}</option>
</select>
@endforeach

sortBy : برای مرتب سازی collection ها بر اساس یک کلید خاص . همچنین ما sortByDesc را داریم که متد مرتب سازی آن Desc می باشد.

$sorted = $collection->sortBy('price');

همچنین می توان بر اساس یک callback خاص مرتب سازی انجام شود. در مثال زیر بر اساس تعداد رنگ های محصولات مرتب سازی به صورت صعودی انجام شده.

$sorted = $collection->sortBy(function ($product, $key) {
    return count($product->colors);
});
$sorted->values()->all();

each : این متد collection ها را iterate می کند و به ازای هر کدام collection را بر می گرداند(passes each item to a callback) .

$result = $collection->each(function ($item, $key) { if (/* some condition */) { return false; } }); return $result;

گفتیم که each یک نتیجه را بر می گرداند. در مثال بالا به ازای شرط خاص collection بر نمی گردد. اگر در closure موجود در each ما return انجام بدهیم عملیات iteration اتمام پیدا می کند.

map : روی آرایه پایه iterate انجام می دهد اما چیزی را بر نمی گرداند . این متد صرفا برای اجرای یک عملیات خاص روی اعضای آرایه پایه می باشد.

$multiplied = $collection->map(function ($item, $key) {
    return $item * 2;
});

$multiplied->all();

تفاوت آن با each همان برنگرداندن نتیجه می باشد. همان طور که می بینید درون closure مربوط به each ما هیچ گونه return نداریم و در map ما اگر لازم بدانیم که collection برگردد باید return کنیم.

every : یک شرط را به ازای تمامی اعضای مجموعه بررسی می کند (AND) و در صورت درست بودن تمامی موارد true بر می گرداند.


pop : مورد آخر را بر میگرداند و بعد از کل مجموعه حذف می کند.

$collection = collect([1, 2, 3, 4, 5]);
$collection->pop(); // 5
$collection->all(); // [1, 2, 3, 4]

pull : با استفاده از کلید یکی از موارد را بر می گرداند و بعد از آن از مجموعه حذف می کند.

push : یک آیتم را به انتهای مجموعه اضافه می کند.

put : یک ست از کلید مقدار را به انتهای مجموعه اضافه می کند.

Extending Collections

علاوه بر متد های پیش فرض کلاس Collection ما می توانیم با استفاده از Collection::macro متد های جدیدی به این کلاس اضافه کنیم.

Collection::macro('toUpper', function () {
    return $this->map(function ($value) {
        return strtoupper($value);
    });
});
$collection = collect(['first', 'second']);
$upper = $collection->toUpper();

در مثال بالا به collection یک متد جدید به نام toUpper اضافه کردیم که می توان با استفاده از آن یک رشته را upper case کرد.

مکان تعریف متد جدید Collection می تواند قبل از استفاده از آن باشد . اما برای استفاده مجدد و راحت بودن در ترتیب ایجاد اشیا و پیش نیاز ها می توان آن ها در Service Provider تعریف کنید.

 Eloquent Collection

Collection نوعی شئ با ویژگی های خاص می باشد ، به طور کل نتیجه ای که از Eloquent باز می گردد شئ ای از کلاس Illuminate\Database\Eloquent\Collection می باشد که شامل داده های مدل و هر آنچه داده یا متد از طریق Relations داشته باشیم می باشد.

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

این کلاس از Laravel Base Collection ارث بری می کند و می توان از متد های این کلاس در Eloquent Collection استفاده کرد. همچنین همانند یک آرایه می توان در یک حلقه المان های آن را طی کرد (Iterator یا تکرار کننده).

Eloquent Collection ها بسیار قدرتمند تر از آرایه ها می باشند. به طوری که می تواند با استفاده از یک سری متد به هم پیوسته عملیات های مختلفی نظیر reject , map , … انجام داد.

$users = App\User::all();
$names = $users->reject(function ($user) {
    return $user->active === false;
})
->map(function ($user) {
    return $user->name;
});

در مثال بالا ما یک مدل داریم با نام User که در آن ستون یا فیلدی هست با نام active . تمامی User ها را می گیریم (Eloquent Collection باز می گردد). با استفاده از Iterator با نام reject (بر اساس callback داده شده یک سری از اعضا را حذف می کند) اعضای غیر فعال را حذف سپس با استفاده از Iterator با نام map (callback را به ترتیب روی تمامی المان ها اعمال می کند) نام تمامی اعضایی که باقی ماندند (یه تعداد در مرحله قبل reject شدند) را باز می گرداند که در نهایت در متغیر $names ریخته می شود (این متغیر یک آرایه خواهد بود).

 

اشتراک گذاری :

مدیر وب سایت گنوتک . برنامه نویسی رو با زبان C در هفده سالگی شروع کردم . در حال حاضر به برنامه نویسی php برپایه معماری MVC , HMVC و همچنین سیستم مدیریت محتوای WordPress و فریم ورک محبوب لاراول علاقه مند هستم و دوست دارم اطلاعاتم رو با شما به اشتراک بگذارم.

۰ دیدگاه برای Eloquent Collections

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *