اگر از توسعه دهندگان لاراول باشید حتما می دانید که در هنگام استفاده از ORM قدرتمند لاراول (Laravel Eloquent) نتیجه بصورت یک Collections برای ما برگشت داده می شود.
Collections درلاروال متدهایی دارند که می توانند کار ما را در هنگام برنامه نویسی بسیار ساده تر و حرفه ای تر کنند و البته در بسیاری از بخش ها به ما کمک کنند که کدی بهتر و خوانا تر بنویسیم.
ما در این آموزش قصد داریم ۱۵ متد جالب از Collections را برای شما آورده و فواید استفاده و روش استفاده از آن را توضیح دهیم.
مجموعه ها (Collections) تنها به Eloquent ها محدود نیستند و شما می توانید با استفاده از آرایه ها نیز مجموعه ایجاد کرده و از توابع مربوط به Collection ها استفاده نمایید.
برای نمونه شما یک مدل پست دارید که همه پست ها را که دسته بندی آنها php میباشد برمی گرداند:
$posts = App\Post::where('category', 'php')->get();
خروجی دستور بالا یک مجموعه یا کالکشن می باشد. کالکشن ها کلاسی در لاراول هستند که از آرایه ها بصورت داخلی استفاده می کند و امکاناتی زیادی به آن اضاف می کند.
همانطور که گفتیم شما می توانید با استفاده از متد collect نیز از آرایه خود مجموعه ساخته و از توابع مربوط به کالکشن ها استفاده نمایید.
$collection = collect([
[
'user_id' => '1',
'title' => 'Helpers in Laravel',
'content' => 'Create custom helpers in Laravel',
'category' => 'php'
],
[
'user_id' => '2',
'title' => 'Testing in Laravel',
'content' => 'Testing File Uploads in Laravel',
'category' => 'php'
],
[
'user_id' => '3',
'title' => 'Telegram Bot',
'content' => 'Crypto Telegram Bot in Laravel',
'category' => 'php'
],
]);
باید بدانیم پس از دریافت اطلاعات از دیتابیس وقتی ما از متدهای مربوط به کالکشن ها استفاده می کنیم دیگر دیتابیس درگیر نمی شود و عملیات ها بر روی مجموعه برگشت داده شده اعمال می شوند. پس از این بابت نگران استفاده از کالکشن ها و متد های آن نباشید.
ما قصد داریم متد های زیر را با همدیگر بررسی کنیم:
filter()
search()
chunk()
dump()
map()
zip()
whereNotIn()
max()
pluck()
each()
tap()
pipe()
contains()
forget()
avg()
تابع filter() یکی از پر استفاده ترین متدهای کالکشن لاراول می باشد. شما با استفاده از متد میتوانید مجموعه خود را فیلتر کنید. پس از فیلتر تنها مواردی که با فیلتر اعمال شده در callback مطابقت دارند برگشت داده می شوند.
این تابع نمونه جدید را بدون تغییردر نمونه قبلی برخواهد گرداند.
این تابع یک key و value به عنوان کلید و مقدار ورودی می گیرد.
$filter = $collection->filter(function($value, $key) {
if ($value['user_id'] == 2) {
return true;
}
});
$filter->all();
تابع all() همه ی مجموعه را برمیگرداند.
خروجی کد بالا بصورت زیر خواهد بود:
[
1 => [
"user_id" => 2,
"title" => "Testing in Laravel",
"content" => "Testing File Uploads in Laravel",
"category" => "php"
]
]
از این متد برای جستجوی مقدار معینی در یک کالکشن استفاده می شود. اگر مقدار مورد نظر در کالکشن موجود باشد مقدار true در غیر اینصورت مقدار false برگشت داده میشود:
$names = collect(['Alex', 'John', 'Jason', 'Martyn', 'Hanlin']);
$names->search('Jason');
بصورت پیشفرض تابع search() جستجوی آسان را انجام میدهد، اگر شما می خواهید جستجو دقیق باشد یعنی مقدار جستجو از لحاظ نوع نیز بررسی شود می توانید به عنوان ارگومان دوم مقدار true را به این تابع بدهید.
البته می توانید یک متد برگشتی نیز به تابع search بدهیم که این متد اول مقداری که برابر با خواسته ی ما می باشد را برخواهد گرداند. بصورت زیر:
$names = collect(['Alex', 'John', 'Jason', 'Martyn', 'Hanlin']);
$names->search(function($value, $key) {
return strlen($value) == 6;
});
// 3
از این متد میتوانید برای تکه تکه کردن یک collection به اندازه های مورد نظر استفاده نمایید.
$prices = collect([18, 23, 65, 36, 97, 43, 81]);
$prices = $prices->chunk(3);
$prices->toArray();
خروجی کد بالا بصورت زیر خواهد بود:
[
0 => [
0 => 18,
1 => 23,
2 => 65
],
1 => [
3 => 36,
4 => 97,
5 => 43
],
2 => [
6 => 81
]
]
از این تابع می توانید برای نمایش خروجی یک کالکشن استفاده نمایید
$collection = collect(['John Doe', 'Jane Doe']);
$collection->dump();
خروجی بصورت زیر خواهد بود:
Collection {
#items: array:2 [
0 => "John Doe"
1 => "Jane Doe"
]
}
از تابع map می توانید برای انجام یک کار تکراری بر روی مقادیر یک کالکشن استفاده کنید. این تابع یک تابع callback با دو ورودی بصورت زیر می گیرد.
این تابع مقادیر را گرفته و آنها را تبدیل و برگشت می دهد. به نمونه زیر دقت کنید:
$changed = $collection->map(function ($value, $key) {
$value['user_id'] += 1;
return $value;
});
return $changed->all();
خروجی بصورت زیر خواهد بود:
[
[
"user_id" => 2,
"title" => "Helpers in Laravel",
"content" => "Create custom helpers in Laravel",
"category" => "php"
],
[
"user_id" => 3,
"title" => "Testing in Laravel",
"content" => "Testing File Uploads in Laravel",
"category" => "php"
],
[
"user_id" => 4,
"title" => "Telegram Bot",
"content" => "Crypto Telegram Bot in Laravel",
"category" => "php"
]
];
این تابع مقادیر یک آرایه را با مقادیر متناظر در یک کالکشن merge می کند.
به نمونه کد زیر توجه کنید:
$collection = collect(['Chair', 'Desk']);
$zipped = $collection->zip([100, 200]);
$zipped->all();
خروجی بصورت زیر خواهد بود:
[['Chair', 100], ['Desk', 200]]
اگر تعداد آرایه کمتر از تعداد مجموعه باشد لاراول به انتهای خروجی مجموعه عناصر را اضاف خواهد کرد و اگر تعداد آرایه بیشتر از مجموعه یا collection باشد لاورل به ارایه های اضافی مقدار null را اضاف خواهد کرد.
تابع whereNotIn
مقادیری را برخواهد گرداند که در آرایه ای که به آن داده میشود مقادیر متناظر وجود ندارد
برای نمونه به کد زیر دقت کنید:
$collection = collect([
['product' => 'Desk', 'price' => 200],
['product' => 'Chair', 'price' => 100],
['product' => 'Bookcase', 'price' => 150],
['product' => 'Door', 'price' => 100],
]);
$filtered = $collection->whereNotIn('price', [150, 200]);
$filtered->all();
اولین آرگومان، کلیدی می باشد که میخواهیم بررسی کنیم و دومین آرمان نیز آرایه ای از مقادیری می باشد.
خروجی:
[
['product' => 'Chair', 'price' => 100],
['product' => 'Door', 'price' => 100],
]
این تابع بیشترین مقدار را بر حسب کلید داده شده بر خواهد گرداند:
$max = collect([['foo' => 10], ['foo' => 20]])->max('foo');
// 20
$max = collect([1, 2, 3, 4, 5])->max();
// 5
تابع pluck نیز تمام مقادیر مربوط به کلید های داده شده به تابع را بر خواهد گرداند. به کد زیر دقت کنید:
$collection = collect([
['product_id' => 'prod-100', 'name' => 'Desk'],
['product_id' => 'prod-200', 'name' => 'Chair'],
]);
$plucked = $collection->pluck('name');
$plucked->all();
// ['Desk', 'Chair']
ما تنها مقادیر کلید name را خواسته ایم و در خروجی نیز تنها مقادیر مربوط به این کلید برگشت داده شده است. شما می توانید هر چند کلیدی که می خواهید را نیز به pluck بدهید.
مثال 2 :
$collection = collect([
['brand' => 'Tesla', 'color' => 'red'],
['brand' => 'Pagani', 'color' => 'white'],
['brand' => 'Tesla', 'color' => 'black'],
['brand' => 'Pagani', 'color' => 'orange'],
]);
$plucked = $collection->pluck('color', 'brand');
$plucked->all();
// ['Tesla' => 'black', 'Pagani' => 'orange']
این تابع تمام ایتم های یک کالکشن را بررسی خواهد کرد و شما میتوانید بر شرط های خود را در این تابع بررسی کنید:
$collection->each(function ($item, $key) {
// Do something
});
همچنین اگر میخواهید با رسیدن به یک شرط خاص کار تابع به پایان برسد می تواند بصورت زیر مقدار return را برابر false قرار دهید:
$collection->each(function ($item, $key) {
if (/* some condition */) {
return false;
}
});
toArray
()مقدار یک کالکشن را بصورت آرایه برگشت خواهد داد:
$collection = collect(['name' => 'Desk', 'price' => 200]);
$collection->toArray();
/*
[
['name' => 'Desk', 'price' => 200],
]
*/
این متد کل کالکشن را از خود عبور می دهد و آن را برگشت می دهد. برای نمونه کد زیر مقدار sun کالکشن را برای ما برگشت می دهد:
$collection = collect([1, 2, 3]);
$piped = $collection->pipe(function ($collection) {
return $collection->sum();
});
// 6
این متد بررسی می کند که آیا مقدار خواسته شده در کالکشن وجود دارد یا خیر
$collection = collect(['name' => 'Desk', 'price' => 100]);
$collection->contains('Desk');
// true
$collection->contains('New York');
// false
مثال 2:
یک کالکشن بصورت زیر داریم:
$collection = collect([
[
'user_id' => '1',
'title' => 'Helpers in Laravel',
'content' => 'Create custom helpers in Laravel',
'category' => 'php'
],
[
'user_id' => '2',
'title' => 'Testing in Laravel',
'content' => 'Testing File Uploads in Laravel',
'category' => 'php'
],
[
'user_id' => '3',
'title' => 'Telegram Bot',
'content' => 'Crypto Telegram Bot in Laravel',
'category' => 'php'
],
]);
به کد زیر و خروجی ان با توجه به کالکشن بالا دقت کنید:
$collection->contains('user_id', '1');
// true
$collection->contains('title', 'Not Found Title');
// false
نمونه ای دیگر:
$collection->contains(function ($value, $key) {
return strlen($value['title']) < 13;
});
// true
این تابع با توجه به کلید داده شده مقدار مورد نظر را از کالکشن حذف خواهد کرد:
$collection = collect(['name' => 'taylor', 'framework' => 'laravel']);
$collection->forget('name');
$collection->all();
// ['framework' => 'laravel']
$forget = collect(['country' => 'usa', 'state' => 'ny']);
$forget->forget('country')->all();
//return
[//
"state" => "ny"//
]//
مقدار میانگین یک کالکشن را با توجه به کلید های داده شده بر خواهد گرداند:
$average = collect([['foo' => 10], ['foo' => 10], ['foo' => 20], ['foo' => 40]])->avg('foo');
// 20
$average = collect([1, 1, 2, 4])->avg();
// 2
$avg = collect([
['shoes' => 10],
['shoes' => 35],
['shoes' => 7],
['shoes' => 68],
])->avg('shoes');
//30
امیدوارم از این آموزش لذت برده باشید. اگر شما هم متدهای خوبی می شناسید و کار کرده اید از بخش نظرات برای ما ارسال کنید تا همه دوستان استفاده کنند.
برای اطلاع از پاسخ به نظر شما می توانید ایمیل یا شماره موبایل خود را وارد نمایید. *
ایمیل و شماره موبایل شما کاملا مخفی خواهد ماند و در سایت نمایش داده نخواهد شد. *
هنوز برای این مطلب نظری ارسال نشده است!