Добрый день! Возник вопрос по миграциям. Вроде делал все как нужно, код ниже, но возникает ошибка при применении сего кода. Ошибка такого рода : > add foreign key fk-member-id: {{%member}} (id) references {{%adview}} (id_member) ...Exception 'yii\d
b\Exception' with message 'SQLSTATE[HY000]: General error: 1215 Cannot add foreign key constraint
The SQL being executed was: ALTER TABLE `member` ADD CONSTRAINT `fk-member-id` FOREIGN KEY (`id`) REFERENCE
S `adview` (`id_member`)'
Error Info:
Array
(
[0] => HY000
[1] => 1215
[2] => Cannot add foreign key constraint
Сам код миграций:
<?php
use yii\db\Migration;
class m130524_201442_create_members_table extends Migration
{
public function up()
{
$tableOptions = null;
if ($this->db->driverName === 'mysql') {
// http://stackoverflow.com/questions/7668 ... unicode-ci
$tableOptions = 'CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE=InnoDB';
}
$this->createTable('{{%member_stats}}', [
'id_member' => $this->integer(),
'money' => $this->float()->notNull(),
'points_ptc' => $this->float()->notNull(),
'clicks' => $this->integer()->notNull(),
'chart_num' => $this->integer()->notNull()->unique(),
'status' => $this->smallInteger()->notNull()->defaultValue(10),]);
$this->addPrimaryKey('pk-member_stats-id_member','{{%member_stats}}','id_member' );
$this->createTable('{{%adview}}', [
'id_member' => $this->integer(),
'id_ad' => $this->integer(),
'ip' => $this->integer()->notNull(),
'data_view' => $this->dateTime()->notNull(),
], $tableOptions);
$this->createIndex(
'idx-ad-ip', '{{%adview}}', 'ip'
);
$this->createTable('{{%member}}', [
'id' => $this->integer(),
'username' => $this->string()->notNull()->unique(),
'auth_key' => $this->string(32)->notNull(),
'password_hash' => $this->string()->notNull(),
'password_reset_token' => $this->string()->unique(),
'email' => $this->string()->notNull()->unique(),
'created_at' => $this->integer()->notNull(),
'updated_at' => $this->integer()->notNull(),
], $tableOptions);
$this->addPrimaryKey('pk-member-id','{{%member}}','id' );
$this->createIndex(
'idx-member-username',
'{{%member}}',
'username'
);
$this->createIndex(
'idx-member-email',
'{{%member}}',
'email'
);
$this->addForeignKey(
'fk-member_stats-id',
'{{%member}}',
'id',
'{{%member_stats}}',
'id_member',
'CASCADE'
);
$this->addForeignKey(
'fk-member-id',
'{{%member}}',
'id',
'{{%adview}}',
'id_member'
);
}
public function down()
{
$this->dropTable('{{%member}}');
$this->dropTable('{{%adview}}');
$this->dropTable('{{%member_stats}}');
}
}
Слыхал что ключи надо устанавливать на промежуточную таблицу только тогда, когда она уже создана. Поэтому пришлось похимичить с файлом. Какаято ошибка в ключе прошу помочь.
Вопрос по миграциям.
Re: Вопрос по миграциям.
Тебе в таблицу adview нужно поставить primaryKey
Re: Вопрос по миграциям.
Неверный порядок параметров, сначала идет что ссылает, потом на что ссылается:
И желательно таблицы создавать в правильном порядке, в данном случае при создании это не страшно, но вот при откате этой миграции будет ошибка в связи с первым удалением таблицы на которую ссылаются FK.
Код: Выделить всё
$this->addForeignKey(
'fk-member_stats-id',
'{{%member_stats}}',
'id_member',
'{{%member}}',
'id',
'CASCADE'
);
Код: Выделить всё
public function down()
{
$this->dropTable('{{%adview}}');
$this->dropTable('{{%member_stats}}');
$this->dropTable('{{%member}}');
}