Подтвердить что ты не робот

Laravel отношения в миграции?

Я знаю, что вы легко можете определить отношения таблиц с помощью $this->belongs_to(), $this->has_many() и т.д., но я не понимаю, как создается таблица отношений; таблицу, которая связывает две таблицы вместе (я забыл, что называется этим термином).

Скажем, я создаю таблицу пользователей. Я хочу, чтобы этот пользователь принадлежал к определенной "роли". Существует несколько ролей, и каждая роль может иметь несколько пользователей. Мне также нужно создать таблицу roles для этого. Пока что так хорошо.

Но после прочтения документации, она говорит, что я должен добавить $this->belongs_to() в модель, а не сама миграция. Когда и как создается таблица отношений? Если я создаю таблицы roles и users и добавлю $this->belongs_to('roles') к модели users и $this->has_many('users') в модель roles, будет ли создана средняя таблица автоматически?

4b9b3361

Ответ 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')

для переноса статьи и т.д.