آفلاین
user-avatar

مشکل در گرفتن دسته و زیر دسته به همراه ایتمهای آن

2 سال پیش
توسط رضا رستمی آپدیت شد
آفلاین
user-avatar
تیرداد ( 6738 تجربه )
2 سال پیش

من در حال طراحی یک سایت برای یک آژانس هواپیمایی هستم برای یکی از بخش های وب سایت نیازدارم لیست قارها و کشورها و شهرها و ... رو که قبلا به صورت پدر و فرزند در یک جدول ذخیره کردم رو در بیارم و در نهایت فقط کشورهایی رو نشون بدم که برای اونها تور ثبت شده .

صفحه من به این صورت کار می کنه که اگر من این آدرس رو فراخونی کنم
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();

سوالم این هست که چطور این کار رو درست و اصولی انجام بدم . و راه حل بهتری هست ؟

آفلاین
user-avatar
علی ( 14211 تجربه )
2 سال پیش
تخصص : Laravel

یک پیکج وجود داره بنام laravel nested set
بهترین پکیجی هست که من دیدم تا الان
مشکلتون رو حل میکنه

آفلاین
user-avatar
رضا رستمی ( 1283 تجربه )
2 سال پیش

@hesammousavi
سلام مهندس
خواهش این مورد رو توی دوره فعلی نود بیان کنین که بعد ها ما هم به این مشکل نخوریم
مرسی از شماااااااااا

برای ارسال پاسخ باید وارد سایت شوید