Невозможно добавить ограничение внешнего ключа с помощью phinx

Я пытаюсь использовать phinx, чтобы добавить пару связанных таблиц. Я создал свою миграцию:

<?php

use Phinx\Migration\AbstractMigration;

class CreatesCognitiveMappingTables extends AbstractMigration
{
    public function up()
    {
        $this->table("cognitive_mapping")
            ->changeColumn('id', 'biginteger', ['identity' => true])
            ->addColumn("user_id", "biginteger", ["signed" => false])
            ->addColumn("participant_id", "integer")
            ->addColumn("session_number", "integer")
            ->addColumn("date_time", "datetime")
            ->addColumn("image_file_link", "text")
            ->addColumn("time", "decimal", ["precision" => 10, "scale" => 5])
            ->addColumn("test_trial_complete", "boolean")
            ->addTimestamps()
            ->create();

        $child = $this->table("cognitive_mapping_dragdrop_results");
        $child
            ->changeColumn('id', 'biginteger', ['identity' => true])
            ->addColumn("cognitive_mapping_id", "biginteger", ["signed" => false])
            ->addColumn("box_number", "integer")
            ->addColumn("correct_answer", "text")
            ->addColumn("given_answer", "text")
            ->addColumn("accuracy", "boolean")
            ->addTimestamps()
            ->create();

        $child
            ->addForeignKey("cognitive_mapping_id", "cognitive_mapping", "id", ["delete" => "CASCADE"])
            ->save();
    }

    public function down()
    {
        $this->table("cognitive_mapping_dragdrop_results")->drop()->save();
        $this->table("cognitive_mapping")->drop()->save();
    }
}

Но когда я запускаю миграцию, я получаю сообщение об ошибке, в котором говорится, что невозможно добавить ограничение внешнего ключа:

сообщение об ошибке

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

Я использую php 7.3 и версию 0.12.1 Phinx.

Любые идеи?


person Chris Schmitz    schedule 11.06.2020    source источник


Ответы (1)


А, только что придумал.

Несмотря на то, что ограничение внешнего ключа не добавляется, таблицы все еще создаются, поэтому я смог просмотреть структуру таблицы:

структура таблицы и подсказка!

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

Я подозревал, что из-за этого, когда я пытался добавить ограничение в дочернюю таблицу, поля не совпадали (не могли содержать одни и те же данные), поэтому это не удалось.

Я также подозревал, что поле не было изменено, потому что я пытался изменить столбец до того, как он был фактически создан, поэтому я реорганизовал свою миграцию, чтобы разбить шаги:

class CreatesCognitiveMappingTables extends AbstractMigration
{
    public function up()
    {
        // * set up the bulk of the parent table
        $parent = $this->table("cognitive_mapping")
            ->addColumn("user_id", "biginteger", ["signed" => false])
            ->addColumn("participant_id", "integer")
            ->addColumn("session_number", "integer")
            ->addColumn("date_time", "datetime")
            ->addColumn("image_file_link", "text")
            ->addColumn("time", "decimal", ["precision" => 10, "scale" => 5])
            ->addColumn("test_trial_complete", "boolean")
            ->addTimestamps();

        // * create the table
        $parent->create();

        // * now that the table is created, update it to convert the primary key to a unsigned big integer
        $parent
            ->changeColumn('id', 'biginteger', ['identity' => true, 'signed' => false])
            ->save();

        // * Make the child table
        $child = $this->table("cognitive_mapping_dragdrop_results");
        $child
            ->changeColumn('id', 'biginteger', ['identity' => true])
            ->addColumn("cognitive_mapping_id", "biginteger", ["signed" => false]) // ! note that our to-be foreign key field is already an unsigned big int
            ->addColumn("box_number", "integer")
            ->addColumn("correct_answer", "text")
            ->addColumn("given_answer", "text")
            ->addColumn("accuracy", "boolean")
            ->addTimestamps()
            ->create();

        // * Now that both our foreign key and primary key fields match we can add the constraint
        $child
            ->changeColumn('id', 'biginteger', ['identity' => true, "signed" => false])
            ->addForeignKey("cognitive_mapping_id", "cognitive_mapping", "id", ["delete" => "CASCADE"])
            ->save();
    }

    public function down()
    {
        $this->table("cognitive_mapping_dragdrop_results")->drop()->save();
        $this->table("cognitive_mapping")->drop()->save();
    }
}

Мне удалось успешно выполнить миграцию:

успех!!

И ограничение добавлено правильно:

добавлено ограничение, так приятно!

так мило :)

person Chris Schmitz    schedule 12.06.2020