Я работаю над проектом интернет-магазина с использованием Laravel 8, и в этом проекте есть 4 типа категорий:

Main Category (such as supermaket)
Superior Category (such as dairy & ...)
Secondary Category (such as cheese & ...)
Secondary Sub Category (such as cream cheese & ...)

И для каждой категории я сделал отдельную модель и таблицу.

И все таблицы идут с одинаковыми полями:

enter image description here

Итак, это захват superior_categories с родительским идентификатором 1, который является идентификатором основной категории supermarket.

А это отношение «один ко многим» для модели MainCategory:

class MainCategory extends Model
{
    use HasFactory;
    protected $fillable = ['name','short_name','description','pciture'];
    protected $table = 'main_categories';

    public function superiors()
    {
        return $this->hasMany(SuperiorCategory::class);
    }
}

Теперь мне нужно показать ВСЕ категории в одной таблице, поэтому мой вопрос заключается в том, должен ли я получать все категории отдельно, например так:

public function index()
    {
        $mainCategory = MainCategory::all();
        $superiorCategory = SuperiorCategory::all();
        $cat = Cat::all();
        $subcat = Subcat::all();

        return view('admin.categories.index', compact('mainCategory','superiorCategory','cat','subcat'));
    }

Или есть другой лучший способ сделать это.

На самом деле, как правильно обрабатывать отображение нескольких категорий за одной таблицей

0
nitinos 3 Фев 2022 в 23:08
1
На мой взгляд, у вас должна быть только 1 таблица Catrgories. Вы можете добавить столбец для идентификации различных типов, и каждый из них может иметь parent_id. Это будет рекурсивная связь, в которой каждая категория может иметь несколько дочерних элементов, каждая со своими собственными дочерними элементами. Вы сделаете это очень сложным для себя, разделив это на несколько таблиц/моделей. Кроме того, Cat — не лучшее название модели; Я не думаю Category, когда читаю это, я думаю 🐈
 – 
Tim Lewis
3 Фев 2022 в 23:11
В чем разница между вашей моделью MainCategory и SuperiorCategory?
 – 
IGP
3 Фев 2022 в 23:11

2 ответа

Это плохая структура для многоуровневых категорий в вашей БД, вам просто нужна таблица для категорий и хранить родительскую категорию или другой уровень в столбце, например, category_id введите здесь описание изображения

0
Farid HaghGooyan 3 Фев 2022 в 23:22

Нет чистого способа сделать это, но вот грязный способ:

class MainCategory extends Model
{
    use HasFactory;
    protected $fillable = ['name','short_name','description','pciture'];
    protected $table = 'main_categories';
    protected $with = [ 'parent' ];

    public function parent()
    {
        return $this->hasMany(SuperiorCategory::class);
    }

    public function getAncestorsAttribute() {
        return collect($this->parent)->concat($this->parent?->ancestors??[]);
    }
}

Тогда, если вы сделаете $model->ancestors, вы должны их получить. Однако это должно будет выполнять один запрос для каждого предка каждый раз, когда вы загружаете одну из моделей MainCategory, что может оказаться очень дорогим.

Это предполагает, что ваша модель SuperiorCategory имеет аналогичную компоновку

0
apokryfos 3 Фев 2022 в 23:32