@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 رو فقط برای نمونه دادم !!! منظورم این نبود که همونو استفاده کنید . 😂
از post هم نباید استفاده کنید شما میخواید category مورد نظر رو برگردونید پس قاعدتا باید مدل Category رو صدا بزنید
سلام شما با چه مقداری category رو در لینک مقدار دهی میکنید این مقدار رو بگید همچنین آیا برای اون مقدار route model binding قرار دادید که میخواید اطلاعات برگرده ؟
<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
خوب شما داری الان با slug بر میگردونی الان شما که اصلا route model binding مشخص نکردی چرا باید بر اساس کاری که پیش بردید براتون category رو برگردونه !!!!
یعنی استراتژی شما چی بوده این وسط !
چون اگر دقت کنید این روش تعریف روت زمانی جواب میده که id وارد کنید اما در اینجا که میخواید از slug معرفتی کنید باید یک route model binding جداگانه تعریف کنید که از طریق مستندات لاراول میتونید این موضوع رو پیدا کنید
مشکل شما تماما از یک اشتباه سرچشمه میگیره .
الان شما در اینجا بجای slug اگر id قرار بدید راحت اطلاعات برگشت داده میشه . اما با توضیحات که در بالا دادم شما نیاز به این روش دارید
مگه اینجا از route model binding استفاده نکردم؟
public function category(Category $category)
{
$posts = $category->posts()->paginate(8);
return view('site.post.index',compact('posts'));
}
اگر نه میشه یه توضیحی بدین که چیکار کنم؟
این چیزی که الان شما استفاده کردین بصورت دیفالت تنها از 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');
و مابقی داستان مثل قبله من قطعا روش دومی که گفتم رو پیشنهاد میکنم
Route::bind('categorySlug', function($value)
{
return User::where('slug', $value)->firstOrFail();
});
چرا user رو where کردین؟
@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 رو فقط برای نمونه دادم !!! منظورم این نبود که همونو استفاده کنید . 😂
از post هم نباید استفاده کنید شما میخواید category مورد نظر رو برگردونید پس قاعدتا باید مدل Category رو صدا بزنید
برای گرفتن پستهای مربوط به یک دستهبندی بهتر نبود از رلیشن one to many استفاده کنید؟
public function posts() { return $this->hasMany(Post::class); }
سلام
میشه از ریلیشن استفاده کرد یعنی ریلیشن کاربر رو تغییرش داده ، ولی مهندس موسوی جهت سادگی به کاربر عزیز پیشنهاد route model binding رو داده ، یعنی کاربر با استفاده از اسلاگ در روت اطلاعات رو برگردونه.
آیا مایل به ارسال نوتیفیکیشن و اخبار از طرف راکت هستید ؟