مرتضی صبیحی
6 سال پیش توسط مرتضی صبیحی مطرح شد
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'));
    }

ثبت پرسش جدید
حسام موسوی
تخصص : طراح و برنامه نویس
@hesammousavi 6 سال پیش مطرح شد
0

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


حسام موسوی
تخصص : طراح و برنامه نویس
@hesammousavi 6 سال پیش مطرح شد
0

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


مرتضی صبیحی
تخصص : Front-end developer
@mortezasabihi 6 سال پیش مطرح شد
0

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


حسام موسوی
تخصص : طراح و برنامه نویس
@hesammousavi 6 سال پیش آپدیت شد
0

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


مرتضی صبیحی
تخصص : Front-end developer
@mortezasabihi 6 سال پیش مطرح شد
0

@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

حسام موسوی
تخصص : طراح و برنامه نویس
@hesammousavi 6 سال پیش مطرح شد
0

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


مرتضی صبیحی
تخصص : Front-end developer
@mortezasabihi 6 سال پیش مطرح شد
0

@hesammousavi

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

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

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


حسام موسوی
تخصص : طراح و برنامه نویس
@hesammousavi 6 سال پیش مطرح شد
0

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

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


مرتضی صبیحی
تخصص : Front-end developer
@mortezasabihi 6 سال پیش مطرح شد
0

@hesammousavi

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

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


مرتضی صبیحی
تخصص : Front-end developer
@mortezasabihi 6 سال پیش مطرح شد
0

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

public function boot()
    {
        //

        parent::boot();

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

حسام موسوی
تخصص : طراح و برنامه نویس
@hesammousavi 6 سال پیش مطرح شد
0

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


علی بیات
تخصص : توسعه دهنده ارشد وب
@ali.bayat 6 سال پیش مطرح شد
0

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


سیدعلی موسوی
تخصص : سی شارپ و پی اچ پی
@juza66 6 سال پیش آپدیت شد
0

@ali.bayat

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


علی بیات
تخصص : توسعه دهنده ارشد وب
@ali.bayat 6 سال پیش مطرح شد
0

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


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

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