Yii2 — не удается добавить ограничение внешнего ключа

#php #mysql #yii2

#php #mysql #yii2

Вопрос:

Я пришел из мира Laravel. Я знаю, что внешние ключи необходимы для правильной работы отношений. Это всего лишь мой второй день работы с фреймворком Yii2.

Я соответствующим образом настроил свои первичные индексы и внешние ключи, как вы можете видеть в моем коде. У меня есть две таблицы: таблица country и таблица city. Город может принадлежать стране, а в стране много городов:

Страны

 
use yiidbMigration;

/**
 * Handles the creation of table `{{%countries}}`.
 */
class m190313_154240_create_countries_table extends Migration
{
    /**
     * {@inheritdoc}
     */
    public function safeUp()
    {
        $this->createTable('{{%countries}}', [
            'id' => $this->primaryKey(),
            'name' => $this->string(),

        ]);
        // add primary index
        $this->createIndex(
            '{{%idx-country_id}}',
            '{{%countries}}',
            'id'
        );
    }

    /**
     * {@inheritdoc}
     */
    public function safeDown()
    {
        $this->dropTable('{{%countries}}');
    }
}
  

Города

 
use yiidbMigration;

/**
 * Handles the creation of table `{{%cities}}`.
 * Has foreign keys to the tables:
 *
 * - `{{%country}}`
 */
class m190313_192616_create_cities_table extends Migration
{
    /**
     * {@inheritdoc}
     */
    public function safeUp()
    {
        $this->createTable('{{%cities}}', [
            'id' => $this->primaryKey(),
            'country_id' => $this->integer()->notNull(),
            'name' => $this->string('100')->notNull(),
        ]);

        // creates index for column `country_id`
        $this->createIndex(
            '{{%idx-cities-country_id}}',
            '{{%cities}}',
            'country_id'
        );

        // add foreign key for table `{{%country}}`
        $this->addForeignKey(
            '{{%fk-cities-country_id}}',
            '{{%cities}}',
            'country_id',
            '{{%country}}',
            'id',
            'CASCADE'
        );
    }

    /**
     * {@inheritdoc}
     */
    public function safeDown()
    {
        // drops foreign key for table `{{%country}}`
        $this->dropForeignKey(
            '{{%fk-cities-country_id}}',
            '{{%cities}}'
        );

        // drops index for column `country_id`
        $this->dropIndex(
            '{{%idx-cities-country_id}}',
            '{{%cities}}'
        );

        $this->dropTable('{{%cities}}');
    }
}
  

Yii2, похоже, не так хорошо документирован, как Laravel. Google говорит, что мне нужно добавить первичные ключи. Сделал это, не повезло. Чего мне не хватает?

Ответ №1:

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

 $this->addForeignKey(
'{{%fk-cities-country_id}}',
'{{%cities}}',
'country_id',
'{{%country}}',
'id',
'CASCADE'
);
  

Вы создаете таблицу с именем {{%countries}} при countries переносе, тогда как у вас есть '{{%country}}' при cities переносе. Измените его на '{{%countries}}' , и это сработает.

Примечание: вам нужно будет удалить таблицу cities перед повторным запуском миграции.

Подробнее о миграциях читайте здесь