آفلاین
user-avatar

مشکل در نمایش پست های یک دسته بندی

2 سال پیش
توسط علی بیات آپدیت شد
آفلاین
user-avatar
مرتضی صبیحی ( 9846 تجربه )
2 سال پیش
تخصص : (VueJs) Front-end developer

@hesammousavi
سلام من دسته بندی هارو تو sidebar نمایش دادم و روت هامو تعریف کردم ولی وقتی روی یک دسته بندی کلیک میکنم صفحه ی page not found برام باز میشه

من از ریلیشن many to many استفاده کردم
مدل category:


    public function posts()
    {
        return $this->belongsToMany(Post::class,'post_category');
    }

مدل post:

    public function categories()
    {
        return $this->belongsToMany(Category::class,'post_category');
    }

view composer

view()->composer('_partials._sidebar',function ($view){
           $categories = Category::all();
           $categories = $categories->chunk(round($categories->count() /2));

           $view->with(compact('categories'));
        });

route

    Route::get('/category/{category}','SiteController@category')->name('category');

site controller

    public function category(Category $category)
    {
        $posts = $category->posts()->paginate(8);
        return view('site.post.index',compact('posts'));
    }
بهترین پاسخ انتخاب شده توسط مرتضی صبیحی
آفلاین
user-avatar
حسام موسوی
2 سال پیش

من مدل User رو فقط برای نمونه دادم !!! منظورم این نبود که همونو استفاده کنید . 😂
از post هم نباید استفاده کنید شما میخواید category مورد نظر رو برگردونید پس قاعدتا باید مدل Category رو صدا بزنید

آفلاین
user-avatar
حسام موسوی ( 382959 تجربه )
2 سال پیش
تخصص : طراح و برنامه نویس

سلام شما با چه مقداری category رو در لینک مقدار دهی میکنید این مقدار رو بگید همچنین آیا برای اون مقدار route model binding قرار دادید که میخواید اطلاعات برگرده ؟

آفلاین
user-avatar
مرتضی صبیحی ( 9846 تجربه )
2 سال پیش
تخصص : (VueJs) Front-end developer

@hesammousavi
متوجه منظورتون نمیشم
منظورتون از چه مقداری چیست؟

آفلاین
user-avatar
حسام موسوی ( 382959 تجربه )
2 سال پیش
تخصص : طراح و برنامه نویس

لینکی که مقدار دهی مینید
مقدار category !!!

آفلاین
user-avatar
مرتضی صبیحی ( 9846 تجربه )
2 سال پیش
تخصص : (VueJs) Front-end developer

@hesammousavi


                <div class="col-md-6">
                    <ul class="list-unstyled">
                        @foreach($row as $category)
                            <li><a href="{{ route('category',['category' => $category->slug]) }}">{{ $category->name }}</a></li>
                        @endforeach
                    </ul>
                </div>
            @endforeach
آفلاین
user-avatar
حسام موسوی ( 382959 تجربه )
2 سال پیش
تخصص : طراح و برنامه نویس

خوب شما داری الان با slug بر میگردونی الان شما که اصلا route model binding مشخص نکردی چرا باید بر اساس کاری که پیش بردید براتون category رو برگردونه !!!!
یعنی استراتژی شما چی بوده این وسط !
چون اگر دقت کنید این روش تعریف روت زمانی جواب میده که id وارد کنید اما در اینجا که میخواید از slug معرفتی کنید باید یک route model binding جداگانه تعریف کنید که از طریق مستندات لاراول میتونید این موضوع رو پیدا کنید
مشکل شما تماما از یک اشتباه سرچشمه میگیره .
الان شما در اینجا بجای slug اگر id قرار بدید راحت اطلاعات برگشت داده میشه . اما با توضیحات که در بالا دادم شما نیاز به این روش دارید

آفلاین
user-avatar
مرتضی صبیحی ( 9846 تجربه )
2 سال پیش
تخصص : (VueJs) Front-end developer

@hesammousavi

مگه اینجا از route model binding استفاده نکردم؟

  public function category(Category $category)
    {
        $posts = $category->posts()->paginate(8);
        return view('site.post.index',compact('posts'));
    }

اگر نه میشه یه توضیحی بدین که چیکار کنم؟

آفلاین
user-avatar
حسام موسوی ( 382959 تجربه )
2 سال پیش
تخصص : طراح و برنامه نویس

این چیزی که الان شما استفاده کردین بصورت دیفالت تنها از id استفاده میکنه یعنی اگر id دسته بندی رو بزارید بر میگرده .
خوب حالا چیکار میشه کرد که با مقدار مورد نظر برگردونه دو راه بصورت کلی هست یک تغیر مقدار route model binding پیشفرض که اونو از حالت پیش فرض خارج میکنه و همه جا بای با این مقدار از route model binding استفاده کنید .که برای این کار هم باید مقدار زیر رو در مدل مربوطه قرار بدید .

    public function getRouteKeyName() {
        return 'id';
    }

بجای id اسم فیلد قرار میگیره مثلا slug
و روش دوم یعنی Explicit Model Binding
باید در RouteServiceProvider و متد boot کد زیر رو قرار بدید البته با پیش نیاز های خودتون

Route::bind('categorySlug', function($value)
{
    return User::where('slug', $value)->firstOrFail();
});

زمانی که این رو تعریف کردید تنها تغییر در بخش زیر اتفاق می افته

Route::get('/category/{categorySlug}','SiteController@category')->name('category');

و مابقی داستان مثل قبله من قطعا روش دومی که گفتم رو پیشنهاد میکنم

آفلاین
user-avatar
مرتضی صبیحی ( 9846 تجربه )
2 سال پیش
تخصص : (VueJs) Front-end developer

@hesammousavi

Route::bind('categorySlug', function($value)
{
    return User::where('slug', $value)->firstOrFail();
});

چرا user رو where کردین؟

آفلاین
user-avatar
مرتضی صبیحی ( 9846 تجربه )
2 سال پیش
تخصص : (VueJs) Front-end developer

@hesammousavi
اگه user بزارم ارور column not found میده که بایدم بده
اگه پست بزارم دوباره صفحه ی page not found میاد

public function boot()
    {
        //

        parent::boot();

        Route::bind('categorySlug', function($value)
        {
            return Post::where('slug', $value)->firstOrFail();
        });
    }
آفلاین
user-avatar
حسام موسوی ( 382959 تجربه )
2 سال پیش
تخصص : طراح و برنامه نویس

من مدل User رو فقط برای نمونه دادم !!! منظورم این نبود که همونو استفاده کنید . 😂
از post هم نباید استفاده کنید شما میخواید category مورد نظر رو برگردونید پس قاعدتا باید مدل Category رو صدا بزنید

آنلاین
user-avatar
علی بیات ( 371718 تجربه )
2 سال پیش
تخصص : توسعه دهنده ارشد وب

برای گرفتن پست‌های مربوط به یک دسته‌بندی بهتر نبود از رلیشن one to many استفاده کنید؟
public function posts() { return $this->hasMany(Post::class); }

آفلاین
user-avatar
سیدعلی موسوی ( 107738 تجربه )
2 سال پیش
تخصص : سی شارپ و پی اچ پی

@ali.bayat

سلام
میشه از ریلیشن استفاده کرد یعنی ریلیشن کاربر رو تغییرش داده ، ولی مهندس موسوی جهت سادگی به کاربر عزیز پیشنهاد route model binding رو داده ، یعنی کاربر با استفاده از اسلاگ در روت اطلاعات رو برگردونه.

آنلاین
user-avatar
علی بیات ( 371718 تجربه )
2 سال پیش
تخصص : توسعه دهنده ارشد وب

@juza666
صحیح. ممنون از توضیحتون

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