У меня есть интересный сценарий, который я хотел бы реализовать в Laravel 5. У меня есть 2 таблицы.
Пользователи (Содержит пользователей сайтов)
Медиа (содержит изображения сайтов, документы, svg-s и т. д.)
Мои технические ограничения:
- У каждого пользователя есть изображение профиля и только одно изображение профиля
- У каждого СМИ есть Автор
Эти ограничения я интерпретирую как логические столбцы в таблице пользователей, в которой есть столбец - profile_image_id (ссылка на столбец идентификатора таблицы мультимедиа). В таблице мультимедиа есть столбец - author_id (ссылка на столбец идентификатора таблицы пользователей).
Это работает хорошо, но становится проблематичным, когда я хочу использовать ремесленную миграцию.
мои миграции выполняются в этом порядке
- Перенос таблицы USERS
- Перенос таблицы 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?
DB::statement('SET FOREIGN_KEY_CHECKS=0;');
. - person thefallen   schedule 17.03.2017