Laravel и mysql соглашения по именам таблиц для категорий - PullRequest
0 голосов
/ 29 февраля 2020

Я столкнулся с проблемой с соглашениями об именах для таблиц mysql в laravel, особенно для имен категорий.

Я обнаружил, что есть много таблиц, похожих на категории, для идентификации Модельная категория. В некоторых случаях мне удавалось переименовывать их, избегая префикса «категория». Например, модель UserCategory стала ролью, а таблица стала ролью. С этим трюком у меня может быть читаемая сводная таблица role_user.

В других случаях я не могу найти правильное имя: ProductCategory, CarCategory, StyleCategory и так далее. Каков наилучший подход в этом случае? И какое лучшее имя я могу назначить для модели и для таблицы?

Кроме того, если модель имеет несколько категорий своего типа, у меня должно быть что-то вроде сводной таблицы product_productcategory, и это ужасно. Вот почему я всегда предпочитаю избегать слова категории в модели / таблице, но я боюсь, что в этих случаях нет других способов.

Какой у вас подход? Есть ли лучшие практики?

1 Ответ

1 голос
/ 29 февраля 2020

Если в ваших таблицах категорий есть общие столбцы, я бы предложил использовать полиморфное отношение многих ко многим c отношение :

product
    id - integer
    name- string

car
    id - integer
    manufacturer - string
    model - string

categories
    id - integer
    name - string

categorizable
    category_id - integer
    categorizable_id - integer
    categorizable_type - string

Product и Car обе модели будут иметь метод categories, который вызывает метод morphToMany базового класса Eloquent:

class Product extends Model
{
    /**
     * Get all of the categories for the product.
     */
    public function categories()
    {
        return $this->morphToMany('App\Category', 'categorizable');
    }
}

Обратное соотношение:

class Category extends Model
{
    /**
     * Get all of the products that are assigned this category.
     */
    public function products()
    {
        return $this->morphedByMany('App\Product', 'categorizable');
    }

    /**
     * Get all of the cars that are assigned this category.
     */
    public function cars()
    {
        return $this->morphedByMany('App\Video', 'categorizable');
    }
}
...