من در حال طراحی یک سایت برای یک آژانس هواپیمایی هستم برای یکی از بخش های وب سایت نیازدارم لیست قارها و کشورها و شهرها و ... رو که قبلا به صورت پدر و فرزند در یک جدول ذخیره کردم رو در بیارم و در نهایت فقط کشورهایی رو نشون بدم که برای اونها تور ثبت شده .
صفحه من به این صورت کار می کنه که اگر من این آدرس رو فراخونی کنم
www.mywebsite.com/packages/asia
این فانکشن اجرا میشه
public function packageOfLocation($slug)
{
$location = Location::whereSlug($slug)->hideHidden()->first();
if(count($location->children)>0)
{
$this->getNotEmptyChildLocations($location);
$categories = array_unique($this->childLocations);
}else{
$categories = $location;
}
return view('site.desktop.tour.packageList',compact('categories'));
}
برای اینکه بتونم همه زیر مجموعه ها رو در بیارم از یه فانکشن ریکرسیو استفاده کردم .
public function getNotEmptyChildLocations($location)
{
foreach ($location->children as $child)
{
if(count($child->packages) > 0)
{
array_push($this->childLocations,$child->parent);
}
if(count($child->children) > 0)
{
$this->getNotEmptyChildLocations($child);
}
}
}
مشکل من این بود که این کد به شدت تعداد کوئری ها رو بالا می برد برای حل این مشکل از متد with استفاده کردم که تعداد کوئری ها رو از 80 تا به 70
عدد رسوند ولی خوب فقط در یه سطح کار می کرد و برای اینکه توی همه سطحهای پایین تر رابطه زیر مجموعه رو بگیره مجبور شدم اینطوری کد نویسی کنم
$location = Location::with('children.children.children.children','children.packages', 'children.children.packages','children.children.parent')->whereSlug($slug)->hideHidden()->first();
سوالم این هست که چطور این کار رو درست و اصولی انجام بدم . و راه حل بهتری هست ؟
یک پیکج وجود داره بنام laravel nested set
بهترین پکیجی هست که من دیدم تا الان
مشکلتون رو حل میکنه
@hesammousavi
سلام مهندس
خواهش این مورد رو توی دوره فعلی نود بیان کنین که بعد ها ما هم به این مشکل نخوریم
مرسی از شماااااااااا
آیا مایل به ارسال نوتیفیکیشن و اخبار از طرف راکت هستید ؟