راکت
حل شده

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

13 پاسخ

@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'));
    }
ثبت پرسش جدید

پاسخ‌ها

13
حسام موسوی
حسام موسوی
@hesammousavi

تخصص: طراح و برنامه نویس

بهترین پاسخ

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

حسام موسوی
حسام موسوی
@hesammousavi

تخصص: طراح و برنامه نویس

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

مرتضی صبیحی
مرتضی صبیحی
@mortezasabihi

تخصص: Front-end developer

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

شاید پاسخ شما همین‌جا باشد

حسام موسوی
حسام موسوی
@hesammousavi

تخصص: طراح و برنامه نویس

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

مرتضی صبیحی
مرتضی صبیحی
@mortezasabihi

تخصص: Front-end developer

@hesammousavi


                <div class="col-md-6">
                    <ul class="list-unstyled">
                        @foreach($row as $category)
                            <li><a href="https://roocket.ir/{{ route('category',['category' => $category->slug]) }}">{{ $category->name }}</a></li>
                        @endforeach
                    </ul>
                </div>
            @endforeach
حسام موسوی
حسام موسوی
@hesammousavi

تخصص: طراح و برنامه نویس

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

مرتضی صبیحی
مرتضی صبیحی
@mortezasabihi

تخصص: Front-end developer

@hesammousavi

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

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

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

حسام موسوی
حسام موسوی
@hesammousavi

تخصص: طراح و برنامه نویس

این چیزی که الان شما استفاده کردین بصورت دیفالت تنها از 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');

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

مرتضی صبیحی
مرتضی صبیحی
@mortezasabihi

تخصص: Front-end developer

@hesammousavi

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

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

مرتضی صبیحی
مرتضی صبیحی
@mortezasabihi

تخصص: 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();
        });
    }
علی بیات
علی بیات
@ali.bayat

تخصص: توسعه دهنده ارشد وب

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

سیدعلی موسوی
سیدعلی موسوی
@juza66

تخصص: سی شارپ و پی اچ پی

@ali.bayat

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

علی بیات
علی بیات
@ali.bayat

تخصص: توسعه دهنده ارشد وب

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

برای ارسال پاسخ لازم است وارد شده یا ثبت‌نام کنید

ورود یا ثبت‌نام