Схема Laravel DB при обращении к двум таблицам

Существует возможность, называемая "интересами", в которой хранятся идентификаторы "категорий" и / или "брендов", в которых заинтересован каждый пользователь. Чтобы предотвратить создание двух отдельных таблиц для user_category_interests а также user_brand_interest Я добавил столбец перечисления под названием type,

Теперь я не могу понять, как мне создать миграцию в Schema Builder, Как установить отношения и внешние ключи,... чтобы воспользоваться преимуществами методов Eloquent.

    Schema::create('user_interests', function (Blueprint $table) {
        $table->increments('id');
        $table->enum('type', ['categories', 'brands']);
        $table->integer('reference_id')->unsigned();
        $table->timestamps();
    });

Есть ли лучший способ вместо создания двух отдельных таблиц и моделей?

PS я пользуюсь laravel 5.4

Brands Table:
id  |  name
-----------
1   | Adidas
2   | Nike
3   | Puma

Categories Table:
id  |  name
-----------
1   | Clothes
2   | Luxury
3   | Sport Wear


User_Interests Table:
id  | user_id |   type   | reference_id
-----------------------------------------
1   | 113     | 'brand'  | 2
1   | 113     | 'brand'  | 3
2   | 113     |'category'| 3
3   | 224     | 'brand'  | 1

1 ответ

Решение

Да - читайте документы по полиморфным отношениям.

Он работает так же, как у вас, но у вас могут быть столбцы interestable_id а также interestable_type (вы можете настроить это на что-то другое, если хотите). interestable_type в буквальном смысле будет строковое представление имени класса, на который ссылаются, как App\Brand или же App\Category а также interestable_id будет основным ключом этой модели.

Лучшая часть в том, что все это делается через Eloquent, уже хорошо идти с ассоциациями, энергичной загрузкой и т. Д.

Изменить: я должен добавить, что ваши настройки 3 таблицы по-прежнему являются лучшим способом для представления этой структуры, просто предлагая имена столбцов, которые вы используете, и как подключить его с Eloquent.

Другие вопросы по тегам