Как преобразовать существующий столбец во внешний ключ с помощью Laravel Migrations

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

У меня есть такая схема:

Schema::create('person_organization', function(Blueprint $table){
   ...

   $table->integer('organization_id');
   ...
});

и я хочу изменить поле organization_id на беззнаковый тип, что позволит использовать его как внешний ключ, ссылающийся на поле id в таблице organizations.

ПРИМЕЧАНИЕ: Простое изменение типа поля при создании таблицы недоступно, потому что система работает в производственном режиме.

Поэтому нам нужно выполнить новую миграцию, чтобы внести эти изменения.

ЗАМЕТКА 2: Я попробовал метод change, как описано в документы laravel, но он застрял в ошибке запроса, как показано ниже:

Illuminate\Database\QueryException : SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ') on delete cascade' at line 1 (SQL: alter table person_organization add constraint person_organization_person_id_foreign foreign key (person_id) references persons () on delete cascade)

«Я попробовал изменить метод, как описано в документации по laravel, но возникла ошибка запроса». какая ошибка?

lagbox 17.07.2018 22:06

@lagbox опубликовать ошибку запроса

Alexandre Thebaldi 17.07.2018 22:13

@iagbox Я обновил вопрос с ошибкой запроса.

thau0x01 17.07.2018 22:16

вы можете опубликовать код, который вы пробовали?

Salman Zafar 17.07.2018 22:20
Schema::table('person_organization', function (Blueprint $table) { // Organization $table->integer('organization_id')->unsigned()->change(); $table->foreign('organization_id')->references('id')->on('or‌​ganizations')->onDel‌​ete('cascade'); // Person $table->integer('person_id')->unsigned()->change(); $table->foreign('person_id')->referenes('id')->on('persons')‌​->onDelete('cascade'‌​); }); @AlexandreThebaldi
thau0x01 17.07.2018 22:22

почему вы меняете таблицу domain_organization? вы не изменяете таблицу лиц?

Salman Zafar 17.07.2018 22:23

Это таблица отношений "многие ко многим". @ Салман-Зафар. но это не имеет значения, потому что ошибка связана не с таблицей, а с ошибкой запроса laravel во время запроса.

thau0x01 17.07.2018 22:24

попробуйте следующее: Schema :: table ('person', function (Blueprint $ table) {$ table-> integer ('organization_id') -> unsigned () -> index () -> cha‌ nge (); $ table- > внешний ('идентификатор_организации') -> ссылки ('идентификатор') -> на ('организации') -> onDel‌ ete ('каскад');});

Salman Zafar 17.07.2018 22:29

@SalmanZafar, я попробую выложить здесь результат.

thau0x01 17.07.2018 22:30

@ThauanCSantos хорошо, конечно

Salman Zafar 17.07.2018 22:30

@SalmanZafar работал на меня. Можете ли вы опубликовать свой ответ как ответ ниже, чтобы я мог оценить его как правильный ответ.

thau0x01 17.07.2018 22:36

@ThauanCSantos опубликовал мой ответ

Salman Zafar 17.07.2018 22:42
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Laravel Scout - это популярный пакет, который предоставляет простой и удобный способ добавить полнотекстовый поиск в ваше приложение Laravel. Он...
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
6
12
4 287
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Из документов Laravel 5.6:

Before modifying a column, be sure to add the doctrine/dbal dependency to your composer.json file.

composer require doctrine/dbal

Затем создайте миграцию:

php artisan make:migration add_organization_foreign_to_persons_table --table=persons

А также:

Schema::table('persons', function (Blueprint $table) {
    $table->unsignedInteger('organization_id')->change();
    $table->foreign('organization_id')->references('id')->on('organizations');
});

У меня только что установлен docrtine/dbal. Я обновил вопрос, показывающий ошибку. @Alexandre Thebaldi

thau0x01 17.07.2018 22:15
$table->integer('organization_id')->unsigned();
$table->foreign('organization_id')->references('id')->on('organizations')->onDelete('cascade');
Ответ принят как подходящий

Учитывая, что вы уже установили пакет доктрина / dbal в своем приложении Теперь создайте перенос php artisan make:migration your_migration_name, а затем при переносе вставьте приведенный ниже код.

    Schema::table('persons', function(Blueprint $table) { 
    $table->integer('organization_id')->unsigned()->index()->change(); 
    $table->foreign('organization_id')->references('id')->on('organizations')- 
  >onDelete('cascade'); 
})

Теперь запустите команду php artisan migrate, и теперь все готово. Удачного кодирования ...

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