Laravel по-русски
      
      
    Русское сообщество разработки на PHP-фреймворке Laravel.
Ты не вошёл. Вход тут.
Страницы 1
Модель:
class Category extends Model
{
    use Sluggable;
    public function sluggable(): array
    {
        return [
            'slug' => [
                'source' => 'name'
            ]
        ];
    }
    public function parent()
    {
        return $this->belongsTo(Category::class, 'parent_id');
    }
    public function categories()
    {
        return $this->hasMany(Category::class, 'parent_id');
    }
    public function children()
    {
        return $this->hasMany(Category::class, 'parent_id')->with('categories');
    }
    public function products()
    {
        return $this->hasMany(Product::class);
    }
}Контроллер
class CategoryController extends Controller
{
    public function show($slug)
    {
        $category = Category::where('slug', $slug)->first();
        $products = $category->products()->orderBy('created_at')->paginate(12);
        return view('category.product', [
            'products' => $products,
            'category' => $category
        ]);
    }
}Данный код выводит все товары одной категории, по ключу slug. Но проблема в том, что категории могут быть вложенные и мне надо, чтобы выводились все товары, в том числе дочерних (если есть) категорий. Например, если выбрать родительскую категорию, то показать список всех товаров (в том числе товары дочерних категорий), а если выбрать только дочернюю категорию, то показать только те товары, которые находятся в данной дочерней категории. Как реализовать такой метод?
Не в сети
А вообще надо менять products() — это описание связи «один ко многим» и тут опушены указание полей в таблицах, т.к. их название совпадают с названиями по умолчанию. Т.е. мы можем products() записать так:
    public function products()
    {
        return $this->hasMany(Product::class, 'category_id', 'id');
    }
Т.е. в таблице с товарами есть колонка category_id в ней id категории к которой относится товар. Т.е. нам надо указать id категории не только родительской, но всех дочерних категории.
Я бы начал решать эту задачу с SQL запроса, т.е. какой должен получится запрос. Если появится понимание на уровне БД какой должен получится запрос, то и тут легче будет разобратся.
Не в сети
Структура БД такая:
categories(id, parent_id, name, slug, ...)
products(id, category_id, name, slug, price, ...)
Не в сети
Страницы 1