#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
перед повторным запуском миграции.
Подробнее о миграциях читайте здесь