Laravel перенос несовместимых внешних ключей - PullRequest
0 голосов
/ 06 февраля 2020

Мне сказали удалить функцию автоинкремента одной из наших таблиц, однако это стало причиной проблем:

PDOException: :( "SQLSTATE [HY000]: Общая ошибка: 3780 Ссылка на столбец limitCardId и ссылочный столбец id в ограничении внешнего ключа roll_control_cards_limitcardid_foreign несовместимы. 1010 *

FK $table->integer('limitCardId')->unsigned()->index();

Отношение $table->foreign('limitCardId')->references('id')->on('limit_cards');

Я прочитал несколько других постов, в которых предлагалось несколько решений, однако ни одна не решила мою проблему, вот список того, что я ' я уже пробовал:

Определив это в моей модели базовой таблицы:

    protected $primaryKey = 'id';
    public $incrementing = false;

Добавление Schema::disableForeignKeyConstraints(); в начале метода up() и Schema::enableForeignKeyConstraints(); в конце, я Вы пробежали composer dump-autoload, php artisan config:clear, php artisan cache:clear.

. Как и предполагалось, здесь приведена версия обеих таблиц, базовая таблица:

 public function up()
    {
        Schema::create('limit_cards', function (Blueprint $table) {
            $table->integer('id');
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('limit_cards');
    }

Таблица, связанная с данной:

    public function up()
    {
        Schema::create('rolling_control_cards', function (Blueprint $table) {
            $table->increments('id');
            $table->integer('limitCardId')->unsigned()->index();
            $table->unique(['controlCardNumber', 'limitCardId']);
            $table->timestamps();

            $table->foreign('limitCardId')->references('id')->on('limit_cards');
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('rolling_control_cards');
    }

Ответы [ 2 ]

1 голос
/ 06 февраля 2020

Чтобы ссылки на внешние ключи были совместимыми, они должны быть точно такого же типа, включая их подпись.

$table->integer('id'); по умолчанию создает целочисленный столбец со знаком. Либо сделайте его без знака соответствия limitCardId, либо сделайте так, чтобы оба подписали.

1 голос
/ 06 февраля 2020

limit_cards

public function up()
{
    Schema::create('limit_cards', function (Blueprint $table) {
        $table->unsignedInteger('id');
        $table->timestamps();
    });
}

unsignedInteger => UNSIGNED INT эквивалентный столбец.

rolling_control_cards

Schema::table('rolling_control_cards', function (Blueprint $table) {
    $table->increments('id');
    $table->unsignedInteger('limitCardId')->nullable();
    $table->unique(['controlCardNumber', 'limitCardId'])
    $table->timestamps();

    $table->foreign('limitCardId')->references('id')->on('limit_cards');
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...