Laravel 5 Eloquent двунаправленная миграция внешнего ключа

У меня есть интересный сценарий, который я хотел бы реализовать в Laravel 5. У меня есть 2 таблицы.

  1. Пользователи (Содержит пользователей сайтов)

  2. Медиа (содержит изображения сайтов, документы, svg-s и т. д.)

Мои технические ограничения:

  1. У каждого пользователя есть изображение профиля и только одно изображение профиля
  2. У каждого СМИ есть Автор

Эти ограничения я интерпретирую как логические столбцы в таблице пользователей, в которой есть столбец - profile_image_id (ссылка на столбец идентификатора таблицы мультимедиа). В таблице мультимедиа есть столбец - author_id (ссылка на столбец идентификатора таблицы пользователей).

Это работает хорошо, но становится проблематичным, когда я хочу использовать ремесленную миграцию.

мои миграции выполняются в этом порядке

  1. Перенос таблицы USERS
  2. Перенос таблицы MEDIA

Мои миграции имеют внешние ключи, установленные как

МИГРАЦИЯ ПОЛЬЗОВАТЕЛЕЙ

$table->foreign('profile_image_id')->references('id')->on('media')->onDelete('restrict')->onUpdate('cascade');

МЕДИА МИГРАЦИЯ

$table->foreign('author_id')->references('id')->on('users')->onDelete('restrict')->onUpdate('cascade');

Я использую команду

php artisan migrate:refresh --seed

Проблема в том, что при создании таблицы пользователей таблица мультимедиа еще не существует. И при попытке добавить отношение внешнего ключа к таблице мультимедиа возникает ошибка SQL, что таблица мультимедиа не существует.

Что я сделал?

Я создал функцию переноса таблицы пользователей, которую запустил после завершения функций заполнения.

    /**
     * Veyzon
     *
     * To be run after the regular run functions on all tables
     * have run
     */
    public static function delayed_up() {
        Schema::table('users', function (Blueprint $table) {
            $table->foreign('profile_image_id')->references('id')->on('media')->onDelete('restrict')->onUpdate('cascade');
        });
    }

Это сработало отлично и ладно, но при ремиграции, то Media table не удалит из-за того, что в пользовательской таблице остались записи, где есть profile_image_id-ы со значениями.

Теперь я подумал, что добавлю несколько строк кода в функцию «вниз» таблиц мультимедиа, которая установит для всех таблиц profile_media_id-s значение null, но мне это не очень нравится, поскольку это, похоже, связывает мои отдельные файлы миграции. вместе, и когда я объявлю это архитектурно нормальным, это станет плохой практикой.

Ребята, что бы вы сделали, чтобы создать двунаправленные отношения внешнего ключа «один к одному» и интегрировать их в миграции Laravel?


person Karl Johan Vallner    schedule 17.03.2017    source источник
comment
Используйте другую миграцию для создания внешних ключей после создания обеих таблиц. Если вы получаете ошибку ограничения внешнего ключа при заполнении, вы можете запустить DB::statement('SET FOREIGN_KEY_CHECKS=0;');.   -  person thefallen    schedule 17.03.2017


Ответы (1)


Простой способ сделать внешний ключ в laravel

public function up()
{
    Schema::create('bank_user_details', function (Blueprint $table) {
        $table->foreign('country')->references('id')->on('country')
                      ->onUpdate('cascade')->onDelete('cascade');

    });
}
person Inderjit Singh    schedule 15.01.2018