Как вообще игнорировать миграцию внешних ключей?

У меня вопрос о миграции в Laravel. Можно ли обрабатывать внешние ключи с помощью простого оператора if? В частности, я хочу гарантировать, что если внешний ключ уже существует, его не следует переносить снова. Есть ли простой способ сделать это?

Это мой код, например.

        if (Schema::connection('orders_import')->hasTable('mymuesli_label')) {
            Schema::connection('orders_import')->table('mymuesli_label', function (Blueprint $table) {
                $table->foreign(['roll'], 'roll_id')->references(['id'])->on('mymuesli_roll');
            });
        }

        if (Schema::connection('orders_import')->hasTable('parameter_mapping')) {
            Schema::connection('orders_import')->table('parameter_mapping', function (Blueprint $table) {
                $table->foreign(['customer'], 'parameter_mapping_fk_customer')->references(['id_customer'])->on('customer');
            });
        }

        if (Schema::connection('orders_import')->hasTable('product_mapping')) {
            Schema::connection('orders_import')->table('product_mapping', function (Blueprint $table) {
                $table->foreign(['customer'], 'product_mapping_fk_customer')->references(['id_customer'])->on('customer');
            });
        }
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
0
53
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Думаю, да, но с laravel 11. С Schema::getForeignKeys('your_table'). Я приведу пример для вашего первого кода:

use Illuminate\Support\Facades\Schema;

$foreignKeys = Schema::connection('orders_import')->getForeignKeys('mymuesli_label');
$foreignKeyExists = false;

foreach ($foreignKeys as $foreignKey) {
    if ($foreignKey['name'] === 'roll_id') {
        $foreignKeyExists = true;
        break;
    }
}

if (!$foreignKeyExists) {
    Schema::connection('orders_import')->table('mymuesli_label', function (Blueprint $table) {
        $table->foreign(['roll'], 'roll_id')->references(['id'])->on('mymuesli_roll');
    });
}

// Then set the $foreignKeyExists to false and keep with the search on your tables.

PS: Этот метод дает вам массив массивов с name (строка) и columns (массив строк), и вам нужно правильно выполнить миграцию ->foreign($columns, $name).

Извините, я мог пропустить упоминание о том, что потенциально может возникнуть около 700 случаев, когда эта проблема может возникнуть. Я создал новые миграции, используя этот пакет github.com/kitloong/laravel-migrations-generator для очень большого проекта. К сожалению, на локальном хосте могут возникнуть проблемы с внешними ключами, если внешний ключ уже существует. Мне нужно решение, которое могло бы обрабатывать весь этот блок кода с помощью оператора if без отдельного перечисления внешних ключей, но я не уверен, возможно ли это. @Франциско

JayVch 06.08.2024 18:26
Ответ принят как подходящий

Я думаю, что это будет простой метод с оператором if. Вот ваш обновленный код миграции.

    if (Schema::connection('orders_import')->hasTable('parameter_mapping')) {
        Schema::connection('orders_import')->table('parameter_mapping', function (Blueprint $table) {
            if (!Schema::hasColumn('parameter_mapping','parameter_mapping_fk_customer')) {
                $table->foreign(['customer'], 'parameter_mapping_fk_customer')->references(['id_customer'])->on('customer');
            }
        });
    }

    if (Schema::connection('orders_import')->hasTable('product_mapping')) {
        Schema::connection('orders_import')->table('product_mapping', function (Blueprint $table) {
            if (!Schema::hasColumn('product_mapping','product_mapping_fk_customer')) {
                $table->foreign(['customer'], 'product_mapping_fk_customer')->references(['id_customer'])->on('customer');
            }
        });
    }

Просто используйте If(!Schema->hasColumn('table_name', 'column_name'))

Этот метод имеет два параметра: hasColumn('table_name', 'column_name')

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