Symfony1.4にて、フィクスチャーファイルからデータベースにデータを入れようとしたらエラー。
# php symfony doctrine:data-load
■ エラー内容
Invalid row key specified: (user) , referred to in (rental) Rental_4
MySQLの外部キー制約のため、関連付けのある部分に値がを入れておらず、エラーになっていました。
mysql> show create table rental;
+--------+--| Table | Create Table
---------------------------------------+
| rental | CREATE TABLE `rental` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`user_id` bigint(20) DEFAULT NULL,
`rented_at` datetime DEFAULT NULL,
`returned_at` datetime DEFAULT NULL,
`delete_flag` tinyint(1) NOT NULL DEFAULT '0',
`created_at` datetime NOT NULL,
`updated_at` datetime NOT NULL,
`slug` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `rental_sluggable_idx` (`slug`),
KEY `user_id_idx` (`user_id`),
CONSTRAINT `rental_user_id_user_id` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci |
+--------+----------------------------+
ここの設定のせいで、外部キーがあるカラムをNULLにできませんでした。
CONSTRAINT `rental_user_id_user_id` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`) ON DELETE CASCADE
■ 解決方法
MySQLにログインして、下記のコマンドで外部キーを削除します。
・参考:MySQL :: MySQL 5.1 リファレンスマニュアル (オンラインヘルプ) :: 9.4.4 FOREIGN KEY 制約
ALTER TABLE tbl_name DROP FOREIGN KEY fk_symbol;
あと、関連付けのあるカラムのfixtureファイルの書き方なんですが、以下のように書いてはいけません。
Rental:
Rental_1:
User: [User_1]
rented_at: '2011-01-01'
returned_at:
delete_flag: 0
Rental_2:
User:
rented_at:
returned_at:
delete_flag: 0
Rental_2 の User: のように書くと、Userに対応するオブジェクトを探しに行って、なくてエラーになるそうです。
代わりに、User: の部分を user_id: と書けばOKです。もしくは、値を入れないので user_id: そのものを書かないという選択肢もあります。
以上です。