سلام
من دسته بندی محصولات رو نمایش دادم میخام وقتی روی هر دسته بندی کلیک میشه همون محصولات نمایش بده
تو href برا اساس id محصول باید باشه ؟ یا بر اساس نام محصول ؟
<ul class="list-group">
@foreach($categories as $category)
<li class="list-group-item">
@if($category->child)
<a href="https://roocket.ir/{{ $category->id }}" class="pb-2"> {{ $category->name }}
@include('layouts.list-categories' , ['categories' => $category->child])
</a>
@endif
</li>
@endforeach
</ul>
این روت ها رو درست تعریف کردم ؟
Route::get('categories/{category}' , 'frontend\CategoryController@index');
Route::get('categories/{category}' , 'frontend\CategoryController@show')->name('category');
کوئری رو نمیدونم به چه صورت بنویسم من به شکل زیر نوشتم وقتی روی دسته بندی میزنم صفحه 404 نمایش میده
public function index()
{
return view('category::index');
}
public function show(Category $category)
{
$categories = Category::get();
return view('Category::frontend.category' , compact('categories'));
}
}
الان به این صورت نوشتم باز کنترلر نمیخونه صفحه 404 نمایش میده
public function show(Category $category)
{
$product = Category::where("name" , $category)->first();
$products = $product->products;
return view('layouts.list-categories' , compact('product'));
}مشکل کنترلر رو نمیدونم باید خودتون بررسی کنید ولی فعلا به همون صورتی که جواب گرفته بودید بنویسید اگر مشکلی نبود و محصولات رو نمایش میداد برید سراغ کنترلر .
این کد هم باید به این صورت باشه
$product = Category::where("name" , $category)->first();
$products = $product->products;
return view('layouts.list-categories' , compact('products'));شاید پاسخ شما همینجا باشد
من کاری به کد لاراول شما ندارم ولی از لحاظ سئویی بهتره که لینک محصول یا هر چی بر اساس id نباشه و بر اساس slug(فارسی مثل این سایت و انگلیسی مثل دیجی کالا) باشه که زودتر امتیاز بگیره.اگر اصرار دارین که حتما از آی دی استفاده کنین آی دی دسته بندی شما نباید ساده باشه مثلا 1و 2 و...برای پیچیده سازی آی دی ها می توانید از کتابخانه Hashid استفاده کنید که کلی امکانات داره و میتونید آی دی رو شما توی view بردارید و encode کنید و سپس داخل کنترلر decode کنید و پیداش کنید.برای درک بهتر این نوع ساختار url میتونید از url سایت فیلیمو استفاده کنید که شبیه زیر می باشد:
https://www.filimo.com/m/5f4zw که 5f4zw آی دی فیلم دراکولا قسمت 3 می باشد و می تونید برای سریع ساختن این کد از یک unique column در mysql استفاده کنید و موقع ساخت دسته بندی این فیلد را برابر یک مقدار random چند رقمی قرار دهید.
@pouria.diesel
سلام
محصولات بر اساس اسلاگ نمایش میدم فقط الان نمیدونم چطوری روی هر دسته بندی میزنم اطلاعاتش رو تو ویو برگردونم
روت رو نمیدونم چطوری تعریف کنم
@eniack
تو اون حالت روت که جواب داد فقط اسم دسته بندی رو نمایش میداد
من میخام اطلاعات هر محصولی که توی دسته بندی هست نمایش بده
@wxyz
خب دوست عزیزم با این کد میتونید محصولات رو نمایش بدید در ویو مد نظر خودتون
$product = Category::where("name" , $category)->first();
$products = $product->products;
return view('layouts.list-categories' , compact('products'));@eniack
همین کدو نوشتم ولی باز هم وقتی روی هر دسته بندی کلیک میکنم صفحه 404 برام نمایش میده
سلام.
اگه از لاراول 8 دارید استفاده میکنید روش تعریف روتتون اشتباه است.
روت خود رو به صورت زیر تعریف کنید، من از slug استفاده کردم.
Route::get('/category/{category:slug}', [\App\Http\Controllers\CategoryController::class, 'show'])->name('category.show');
در قسمت بلید به صورت زیر عمل کنید.
@foreach($categories as $category)
<li class="nav__item nav__item--has-sub"><a href="https://roocket.ir/{{ route('category.show', $category->slug) }}" class="nav__link">{{ $category->name }}</a>
<div class="nav__sub">
<div class="container d-flex item-center flex-wrap container--nav">
@foreach($category->children as $childCategory)
<a href="https://roocket.ir/{{ route('category.show', $childCategory->slug) }}" class="nav__link">{{ $childCategory->name }}</a>
@endforeach
</div>
</div>
</li>
@endforeach
در مدل Category رابطه زیر رو تعریف کنید.
public function products() {
return $this->belongsToMany(Product::class);
}
و در آخر کنترلر خود رو به صورت زیر بنویسید.
public function show(Category $category) {
$products = $category->products()->paginate();
return view('layouts.list-categories', compact('products'));
}
موفق باشید.
@rezajahangir
ممنونم ازتون
از لاراول 7 استفاده میکنم
روت رو به این شکل نوشتم
Route::get('/category/{category:slug}' , 'frontend\CategoryController@show')->name('category');
یک سوال
من محصولات رو بر اساس اسلاگ قرار دادم ، تو جدول category هم باید اسلاگ رو اضافه کنم؟
چنین خطایی بهم داد وقتی روی دسته بندی کلیک کردم
SQLSTATE[42S22]: Column not found: 1054 Unknown column 'slug' in 'where clause' (SQL: select * from `categories` where `slug` = لپ تاپ استوک limit 1)
slug به دیتابیس اضافه کردم
باز هم وقتی روی دسته بندی کلیک کردم خطای 404 نمایش داد
مایگریشن
public function up()
{
Schema::create('categories', function (Blueprint $table) {
$table->id();
$table->string('name');
$table->integer('parent')->default(0);
$table->timestamps();
});
Schema::create('category_product' , function(Blueprint $table) {
$table->unsignedBigInteger('category_id');
$table->foreign('category_id')->references('id')->on('categories')->onDelete('cascade');
$table->unsignedBigInteger('product_id');
$table->foreign('product_id')->references('id')->on('products')->onDelete('cascade');
$table->primary(['category_id' , 'product_id']);
});
}
اسلاگ رو هم مجدد اضافه کردم
public function up()
{
Schema::table('categories', function (Blueprint $table) {
$table->string('slug');
});
}
مدل category
class Category extends Model
{
protected $fillable = ['name' , 'parent' , 'slug'];
public function child()
{
return $this->hasMany(Category::class , 'parent' , 'id');
}
public function products()
{
return $this->belongsToMany(Product::class);
}
public function blog()
{
return $this->belongsToMany(Blog::class);
}
public function getRouteKeyName()
{
return 'slug';
}
}
نکته اول در مورد جدول categories هست که بهتر برای فیلد parent، به صورتی که تعریف کردین عمل نکنین و به صورت زیر بنویسین.
$table->unsignedBigInteger('category_id')->nullable();
$table->foreign('category_id')->references('id')->on('categories')->onUpdate('CASCADE')->onDelete('CASCADE');
اینم فراموش نکنین که $fillable باید تغییر کنه و به صورت زیر نوشته بشه.
protected $fillable = ['name', 'slug', 'category_id'];
همچنین به مدل خود کد زیر رو اضافه کنید.
public function sluggable(): array
{
return [
'slug' => [
'source' => 'name'
]
];
}@rezajahangir
سلام ممنون ازتون
الان روی دسته بندی میزنم این ارور نمایش میده
ErrorException
Invalid argument supplied for foreach() (View: C:\xampp\htdocs\laraft\Modules\Category\Resources\views\layouts\list-categories.blade.php)