راکت

دسته بندی محصولات

34 پاسخ

سلام
من دسته بندی محصولات رو نمایش دادم میخام وقتی روی هر دسته بندی کلیک میشه همون محصولات نمایش بده
تو 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'));
    }
}
ثبت پرسش جدید

پاسخ‌ها

34
Paradox
Paradox
@paradox

تخصص: در حال یادگیری

الان به این صورت نوشتم باز کنترلر نمیخونه صفحه 404 نمایش میده

    public function show(Category $category)
    {

        $product = Category::where("name" , $category)->first();
        $products = $product->products;
        return view('layouts.list-categories' , compact('product'));

    }
فرشید مرادی
فرشید مرادی
@eniack

تخصص: noob

مشکل کنترلر رو نمیدونم باید خودتون بررسی کنید ولی فعلا به همون صورتی که جواب گرفته بودید بنویسید اگر مشکلی نبود و محصولات رو نمایش میداد برید سراغ کنترلر .
این کد هم باید به این صورت باشه

  $product = Category::where("name" , $category)->first();
        $products = $product->products;
        return view('layouts.list-categories' , compact('products'));

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

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

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

نام متد رو تغییر بده و امتحان کن :)

PouriaDiesel
PouriaDiesel
@pouria.diesel

تخصص: برنامه نویس,فرانت کار

من کاری به کد لاراول شما ندارم ولی از لحاظ سئویی بهتره که لینک محصول یا هر چی بر اساس id نباشه و بر اساس slug(فارسی مثل این سایت و انگلیسی مثل دیجی کالا) باشه که زودتر امتیاز بگیره.اگر اصرار دارین که حتما از آی دی استفاده کنین آی دی دسته بندی شما نباید ساده باشه مثلا 1و 2 و...برای پیچیده سازی آی دی ها می توانید از کتابخانه Hashid استفاده کنید که کلی امکانات داره و میتونید آی دی رو شما توی view بردارید و encode کنید و سپس داخل کنترلر decode کنید و پیداش کنید.برای درک بهتر این نوع ساختار url میتونید از url سایت فیلیمو استفاده کنید که شبیه زیر می باشد:
https://www.filimo.com/m/5f4zw که 5f4zw آی دی فیلم دراکولا قسمت 3 می باشد و می تونید برای سریع ساختن این کد از یک unique column در mysql استفاده کنید و موقع ساخت دسته بندی این فیلد را برابر یک مقدار random چند رقمی قرار دهید.

Paradox
Paradox
@paradox

تخصص: در حال یادگیری

@pouria.diesel
سلام
محصولات بر اساس اسلاگ نمایش میدم فقط الان نمیدونم چطوری روی هر دسته بندی میزنم اطلاعاتش رو تو ویو برگردونم
روت رو نمیدونم چطوری تعریف کنم

Paradox
Paradox
@paradox

تخصص: در حال یادگیری

@eniack
تو اون حالت روت که جواب داد فقط اسم دسته بندی رو نمایش میداد
من میخام اطلاعات هر محصولی که توی دسته بندی هست نمایش بده

فرشید مرادی
فرشید مرادی
@eniack

تخصص: noob

@wxyz
خب دوست عزیزم با این کد میتونید محصولات رو نمایش بدید در ویو مد نظر خودتون

 $product = Category::where("name" , $category)->first();
        $products = $product->products;
        return view('layouts.list-categories' , compact('products'));
Paradox
Paradox
@paradox

تخصص: در حال یادگیری

@eniack
همین کدو نوشتم ولی باز هم وقتی روی هر دسته بندی کلیک میکنم صفحه 404 برام نمایش میده

رضا جهانگیر
رضا جهانگیر
@rezajahangir

تخصص: Full-Stack Developer

سلام.
اگه از لاراول 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'));
    }

موفق باشید.

Paradox
Paradox
@paradox

تخصص: در حال یادگیری

@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 نمایش داد

رضا جهانگیر
رضا جهانگیر
@rezajahangir

تخصص: Full-Stack Developer

کدهای مربوط به مدل و مایگریشنِ category رو قرار بدین.

Paradox
Paradox
@paradox

تخصص: در حال یادگیری

@rezajahangir

مایگریشن

   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';
    }
}
رضا جهانگیر
رضا جهانگیر
@rezajahangir

تخصص: Full-Stack Developer

نکته اول در مورد جدول 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'
            ]
        ];
    }
Paradox
Paradox
@paradox

تخصص: در حال یادگیری

@rezajahangir
سلام ممنون ازتون
الان روی دسته بندی میزنم این ارور نمایش میده

ErrorException
Invalid argument supplied for foreach() (View: C:\xampp\htdocs\laraft\Modules\Category\Resources\views\layouts\list-categories.blade.php)
صفحه 2 از 2

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

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