کالکشن ها یکی از بهترین ویژگی های کاربردی لاراول هست. اینجا می خواهیم به چند نکته ی ساده و مهم برای استفاده از کالکشن ها اشاره کنیم.
با ساخت یک جدول ساده شروع میکنیم که یک مدل به نام Person برایش در نظر می گیریم :
CREATE TABLE `people` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`first_name` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
`last_name` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
`type` varchar(50) COLLATE utf8_unicode_ci NOT NULL
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
INSERT INTO `people` (`id`, `first_name`, `last_name`, `type`) VALUES
(1, 'Jeff', 'Madsen', 'programmer'),
(2, 'Mickey', 'Mouse', 'engineer'),
(3, 'Daffy', 'Duck', 'critic'),
(4, 'Mighty', 'Mouse', 'programmer');
نکته اول : ()find
این متد بسیار ساده ای هست که ممکنه گاهی فراموشش کنید.
// returns single row as Collection
$collection = App\Person::find([1]);
dd($collection);
// can return multiple rows as collection
$collection = App\Person::find([1, 2, 3]);
dd($collection);
این روش کار کردن بسیار عالیه چون هم سادست و هم همیشه مطمئنید یک کالکشن دریافت خواهید کرد.
نکته دوم : ()collection->where$
با اطلاعات بالا, چطوری میتونید اطلاعات تمام برنامه نویس ها, مهندس ها و متنقدان رو در آرایه های جداگانه دریافت کنید؟ با استفاده از سه کوئری؟ خیر !
$collection = App\Person::all();
$programmers = $collection->where('type', 'programmer');
$critic = $collection->where('type', 'critic');
$engineer = $collection->where('type', 'engineer');
dd($engineer);
من از ()all:: در کد بالا استفاده کردم, اما شما ممکنه فقط بخواهید اون رو با استفاده از where محدود کنید تا نتیجه کوچک تر بشه.
نکته سوم : ()where و ()lists
اگر وردپرس کار باشید احتمالا از Wordpress data استفاده کردید و بنظرتون جالب اومده. مخصوصا وقتی بخواهید 50 کوئری بزنید و تمام meta data یک کاربر رو دریافت کنید. این هم یک جایگزین مناسب در لاراول هست :
$collection = App\Person::all();
$engineer = $collection->where('type', 'engineer')->lists('first_name');
dd($engineer);
این یک آرایه برمی گردونه ( اما از ورژن 5.1 لاراول به بعد کالکشن بر می گردونه). ما می خواهیم تمام مهندس ها رو داشته باشیم, در مثال وردپرس کاری شبیه زیر انجام میدیم :
// gets all the meta records for user 1
$collection = App\WP_Meta::whereUserId(1)->get();
// I want the first & last name meta values
$first_name = $collection->where('meta_key', 'first_name')->lists('value')[0];
$last_name = $collection->where('meta_key', 'last_name')->lists('value')[0];
...any other fields you want to pluck
نکته چهارم : ()collection->implode$
ممکنه تعجب کنید که بازاریابی چطور یک فایل اکسل 2-D رو به شکل 8-D ماتریسی نمایش میده! و اونها از شما می خواهند همین کار رو در گزارشات انجام بدید. اینجا می خواهیم راهی رو نشون بدیم که یک one-to-many رو وارد یک خانه کنیم :
$collection = App\Person::all();
$names = $collection->implode('first_name', ',');
echo $names;
نکته ششم : ()collection->groupBy$
اگر شما گزارش تهیه می کنید و از این نکته آگاهی ندارید, فرصت مهمی رو از دست دادید. کد زیر رو اجرا کنید و نتیجش رو ملاحظه کنید :
$collection = App\Person::all();
$grouped = $collection->groupBy('type');
dd($grouped);
نکته ششم : بعنوان یک union
ابتدا کد زیر رو مشاهده کنید سپس درموردش صحبت می کنیم. من با استفاده از where سه نمونه مختلف از مدل دریافت کردم :
// the point is to actually combine resutls from different models
$programmers = \App\Person::where('type', 'programmer')->get();
$critic = \App\Person::where('type', 'critic')->get();
$engineer = \App\Person::where('type', 'engineer')->get();
$collection = new Collection;
$all = $collection->merge($programmers)->merge($critic)->merge($engineer);
dd($all);
توجه کنید که شما از مجموعه ی نتایج چه چیزی می خواهید. چون شما دارید اساسا چند نمونه از کلاس های مختلف رو ترکیب می کنید. وقتی شما بین نتیجه loop می کنید, ممکنه شگفت زده بشید. ممکنه بعضی از فیلد ها اونجا نباشند یا نتیجه طوری که می خواهید در نیامده باشد.
دیدگاه و پرسش
در حال دریافت نظرات از سرور، لطفا منتظر بمانید
در حال دریافت نظرات از سرور، لطفا منتظر بمانید