Yii2-无法添加外键约束

时间:2019-03-13 20:09:08

标签: php mysql yii2

我来自Laravel世界。我知道外键是关系正常工作所必需的。这是我使用Yii2框架的第二天。

正如您在我的代码中看到的那样,我已经相应地设置了主索引和外键。我有两个表:国家表和城市表。一个城市可以属于一个国家,一个国家有许多城市:

国家/地区


use yii\db\Migration;

/**
 * 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 yii\db\Migration;

/**
 * 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 个答案:

答案 0 :(得分:0)

Yii与您的错误无关,Yii很棒。原因是您在添加外键

cities迁移中提供的表名不正确
$this->addForeignKey(
'{{%fk-cities-country_id}}',
'{{%cities}}',
'country_id',
'{{%country}}',
'id',
'CASCADE'
);

您正在{{%countries}}迁移中创建名称为countries的表,而在'{{%country}}'迁移中却有cities。将其更改为'{{%countries}}'即可使用。

注意:您需要先删除表cities,然后才能再次运行迁移。

详细了解迁移Here