我来自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说我需要添加主键。这样做了,没有运气。我想念什么?
答案 0 :(得分:0)
Yii与您的错误无关,Yii很棒。原因是您在添加外键
的cities
迁移中提供的表名不正确
$this->addForeignKey(
'{{%fk-cities-country_id}}',
'{{%cities}}',
'country_id',
'{{%country}}',
'id',
'CASCADE'
);
您正在{{%countries}}
迁移中创建名称为countries
的表,而在'{{%country}}'
迁移中却有cities
。将其更改为'{{%countries}}'
即可使用。
注意:您需要先删除表cities
,然后才能再次运行迁移。
详细了解迁移Here