Laravel отношения в миграции?
Я знаю, что вы легко можете определить отношения таблиц с помощью $this->belongs_to()
, $this->has_many()
и т.д., но я не понимаю, как создается таблица отношений; таблицу, которая связывает две таблицы вместе (я забыл, что называется этим термином).
Скажем, я создаю таблицу пользователей. Я хочу, чтобы этот пользователь принадлежал к определенной "роли". Существует несколько ролей, и каждая роль может иметь несколько пользователей. Мне также нужно создать таблицу roles
для этого. Пока что так хорошо.
Но после прочтения документации, она говорит, что я должен добавить $this->belongs_to()
в модель, а не сама миграция. Когда и как создается таблица отношений? Если я создаю таблицы roles
и users
и добавлю $this->belongs_to('roles')
к модели users
и $this->has_many('users')
в модель roles
, будет ли создана средняя таблица автоматически?
Ответы
Ответ 1
Насколько я знаю, таблица отношений не будет создана. Вам нужно будет сделать role_id
в вашей таблице users
, так что при создании пользователя там будет сохранен идентификатор роли. Это позволит вам выбрать всех пользователей, где role_id == '1'
или что бы это ни было.
Например:
$admins = User::where('role_id', '=', 1);
Где в таблице ROLES
запись с ID='1'
является администратором.
Поэтому, чтобы ответить на ваш вопрос, таблица отношений не создается, вместо этого связь существует в ваших двух таблицах в виде столбца role_id
для каждого пользователя. Из интереса вы используете внешние ключи?
Если вы хотите иметь таблицу отношений, вы можете создать одну из них с именем user_roles
или что-то подобное и сохранить там role_id
и user_id
там, однако я думаю, что ее проще использовать вышеупомянутый метод, так как вы можете использовать все ларавелла/доброжелательность.
Надеюсь, что это поможет:)
Ответ 2
При создании переноса вы можете указать внешние ключи в своих таблицах,
то есть.
public function up()
{
Schema::table('roles', function(Blueprint $table) {
$table->foreign('user_id')->references('id')->on('users');
});
}
Это создаст внешний ключ в столбце user_id в таблице ролей.
Преимущества внешних ключей заключаются в том, что при обновлении или удалении таблица внешнего ключа будет автоматически обновляться или "каскадно" отличное описание найдено здесь
Как описано в документации Laravel, вы также можете указать свое каскадное обновление при использовании следующего синтаксиса
$table->foreign('user_id')
->references('id')->on('users')
->onDelete('cascade');
Я бы постарался объяснить это лучше, чем это делает документация. Пожалуйста, прочитайте раздел "Отношения" в документации Eloquent ORM к посмотрите, как это делается.
Ответ 3
Похоже, что некоторые из начальных вопросов никогда не отвечали, т.е. "Когда и как создается таблица отношений" и "будет ли создана средняя таблица автоматически":
Насколько мне известно, эти таблицы нужно создавать вручную. Поэтому создайте файл миграции следующим образом:
php artisan migrate:make create_role_user_table
Обратите внимание, что имена являются единственными и представлены в алфавитном порядке.
Тогда в миграции что-то вроде:
public function up()
{
Schema::create('role_user', function($table) {
$table->increments('id');
$table->integer('role_id');
$table->integer('user_id');
$table->timestamps();
});
}
Надеюсь, что это поможет. Я не уверен, нужны ли временные метки в сводных таблицах или нет, поэтому, пожалуйста, экспериментируйте.
Ответ 4
Хотя это старый пост, я могу внести что-то обновленное. Для Laravel5 Jeffrey Way разработал пакет расширенный генератор Laravel5, который увеличивает возможности генератора php artisan
для
-
make:migration:schema
-
make:migration:pivot
-
make:seed
Для отношения "многие ко многим" между пользователями и ролью вы можете просто использовать
php artisan make:migration:pivot users role
и он будет генерировать требуемый класс миграции. Для этого вам не нужно вводить код вручную.
Ответ 5
Это видео помогло мне.
https://laracasts.com/series/laravel-5-fundamentals/episodes/14
Что удивило меня, так это то, что только одна сторона отношений нуждается в указании указателя в таблице миграции, а не в обоих. Например, если у нас есть Author with many Articles, мы добавляем только
$table->integer('author_id')
для переноса статьи и т.д.