مجموعههای لاراول یا Laravel Collections یکی از قدرتمندترین و بهترین مقررات فریمورک لاراول هستند. در این سری آموزش های لاراول، برخی تکنیکها که میتوانند در هنگام کار با مجموعه های لاراول کاربردی باشند را بررسی خواهیم کرد.
یافتن دادهها
تعدادی راه برای یافتن دادهها در یک مجموعه آرایه وجود دارند.
contains
متد contains() یک مقدار تکی، یک جفت مقدار کلیدی از پارامترها یا یک تابع را میگیرد، و یک مقدار Boolean را درباره وجود یا عدم وجود آن مقدار، بر میگرداند.
/**
* بررسی این که ایا یک مجموعه شامل جفت مقدار کلیدی داده شده است یا نه.
* 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 برای جستجو در یک مجموعه به وسیله یک کلید، یا یک جفت مقدار استفاده کنید.
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');
//مجموعه کاربران با آیدی 1 و سن 51
}
برخی متدهای دیگر شبیه به where وجود دارند که به آنها وارد نخواهم شد. اما بهتر است این سه مورد را به یاد داشته باشید:
whereIn()
- یک جفت مقدار کلیدی را برای جستجو در یک آرایه میگیرد.search()
- به دنبال یک مقدار در یک مجموعه میگردد، اگر مقدار وجود داشته باشد همان ورودی را بر میگرداند، و در غیر این صورت false را بر میگرداند.has()
- یک مقدار Boolean درباره وجود یا عدم وجود مقدار مورد نظر بر میگرداند.
فیلتر کردن دادهها
احتمالا تا بحال از فیلتر کردن در مجموعهها filter() استفاده کرده اید.
/**
* استفاده از متد فیلتر برای دریافت لیستی ار کاربران با سن کمتر از 35
*/
public function filter()
{
$users = User::all();
$youngsters = $users->filter(function ($value, $key) {
return $value->age < 35;
});
$youngsters->all();
//لیست تمام کاربران یه سنی کمتر از 35 دارند.
}
متد filter یک کلید و یک مقدار را به عنوان پارامتر در یک تابع میگیرد.
متد all()
هم را نیز نشان دادم که آرایه زیرین را از یک مجموعه نمایش میدهد.
چینش / مرتب کردن دادهها
مجموعهها قادر هستند تا با استفاده از 2 متد ساده، دادههای خود را چینش نمایند:
sortBy()
- بر حسب یک شاخص، دادهها را به صورت صعودی میچیند.sortByDesc()
- بر حسب یک شاخص، دادهها را به صورت نزولی میچیند.
متدهای sort یک کلید یا یک تابع را به عنوان پارامتر خود میگیرد، که برای چینش مجموعهها استفاده میشود.
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();
dd($mostReleases->values()->toArray());
}
متدهای چینش، شامل کلیدهایی برای هر مقدار میشوند. درحالیکه این میتواند برای برنامه شما مهم باشد، میتوانید با استفاده از متد values()
، آنها را به مقدار افزایشی پیشفرض بازنشانی کنید.
گروهبندی دادهها - groupBy
گروهبندی یک مجموعه، به شما این امکان را می دهد تا دادههای خود را منطقیتر کنید. متد groupBy یک کلید، و یا یک تابع را میگیرد و یک مجموعه گروهبندی شده را بر پایه آن مقدار کلیدی یا تابع بر میگرداند.
public function grouping()
{
$movies = collect([
['name' => 'Back To the Future', 'genre' => 'scifi', 'rating' => 8],
['name' => 'The Matrix', 'genre' => 'fantasy', 'rating' => 9],
['name' => 'The Croods', 'genre' => 'animation', 'rating' => 8],
['name' => 'Zootopia', 'genre' => 'animation', 'rating' => 4],
['name' => 'The Jungle Book', 'genre' => 'fantasy', 'rating' => 5],
]);
$genre = $movies->groupBy('genre');
/*
[
"scifi" => [
["name" => "Back To the Future", "genre" => "scifi", "rating" => 8,],
],
"fantasy" => [
["name" => "The Matrix", "genre" => "fantasy", "rating" => 9,],
["name" => "The Jungle Book", "genre" => "fantasy", "rating" => 5, ],
],
"animation" => [
["name" => "The Croods", "genre" => "animation", "rating" => 8,],
["name" => "Zootopia", "genre" => "animation", "rating" => 4, ],
],
]
*/
$rating = $movies->groupBy(function ($movie, $key) {
return $movie['rating'];
});
/*
[
8 => [
["name" => "Back To the Future", "genre" => "scifi", "rating" => 8,],
["name" => "The Croods", "genre" => "animation", "rating" => 8,],
],
9 => [
["name" => "The Matrix", "genre" => "fantasy", "rating" => 9,],
],
4 => [
["name" => "Zootopia","genre" => "animation", "rating" => 4,],
],
5 => [
["name" => "The Jungle Book","genre" => "fantasy","rating" => 5,],
],
]
*/
}