0
を挿入するとき、私はシンプルなユニットテストを持っている:私はこのテストを実行したときのYii - ARとFKでエラー
$newItem = new Item;
$itemTitle = "New item 1";
$newItem->setAttributes(
array(
'part' => '0000',
'type_id' => 1,
'category_id' => 1,
'title' => $itemTitle,
'title_template' => '',
'color' => 'black',
'size' => 40,
'desc' => 'Test New Item 1',
)
);
$this->assertTrue($newItem->save(false));
、私はエラーを持っている:
CDbException: CDbCommand failed to execute the SQL statement: SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails (`wh_test`.`tbl_item`, CONSTRAINT `fk_goods_type` FOREIGN KEY (`type_id`) REFERENCES `tbl_type` (`id`) ON UPDATE CASCADE). The SQL statement executed was: INSERT INTO `tbl_item` (`part`, `type_id`, `category_id`, `title`, `title_template`, `color`, `size`, `desc`) VALUES (:yp0, :yp1, :yp2, :yp3, :yp4, :yp5, :yp6, :yp7)
/var/www/yii/framework/db/CDbCommand.php:354
/var/www/yii/framework/db/ar/CActiveRecord.php:1014
/var/www/yii/framework/db/ar/CActiveRecord.php:787
/var/www/wh/wh/protected/tests/unit/ItemTest.php:18
私は手動で挿入しようとしますそれはデータベースに入っており、すべて正常です:
INSERT INTO `tbl_item` VALUES (0, '0000', 1, 1, 'New item 1', '', 'black', 40, 'Test New Item 1', NULL);
何が問題なのですか?それは間違った関係に見えますが、私はYii初心者です。 ここ商品モデルのrelatioins()である:
CREATE TABLE IF NOT EXISTS `wh`.`tbl_item` (
`id` INT NOT NULL AUTO_INCREMENT,
`part` VARCHAR(45) NOT NULL,
`type_id` INT NOT NULL,
`category_id` INT NOT NULL,
`title` VARCHAR(200) NOT NULL ,
`title_template` VARCHAR(200) NOT NULL ,
`color` VARCHAR(45) NOT NULL ,
`size` INT NOT NULL ,
`desc` TEXT NOT NULL ,
`desc_template_id` INT NULL ,
PRIMARY KEY (`id`),
CONSTRAINT `fk_goods_type`
FOREIGN KEY (`type_id`)
REFERENCES `wh`.`tbl_type` (`id`)
ON UPDATE CASCADE
ON DELETE RESTRICT,
CONSTRAINT `fk_goods_category`
FOREIGN KEY (`category_id`)
REFERENCES `wh`.`tbl_category` (`id`)
ON UPDATE CASCADE
ON DELETE RESTRICT,
CONSTRAINT `fk_goods_desc_template`
FOREIGN KEY (`desc_template_id`)
REFERENCES `wh`.`tbl_desc_template` (`id`)
ON UPDATE CASCADE
ON DELETE RESTRICT
) ENGINE = InnoDB;
あなたのtbl_typeテーブルにどの行が存在するかを教えてください。それはIDが1の行を持たないようです。 –
ユニットテストを実行する前にテスト行(id:1、name:test)を追加しました – VeroLom
ok。属性を設定するときに、テーブルの主キー(id)を渡していないことがわかります。 idを自動インクリメントとして宣言したこともありません。私はあなたの問題は、あなたが自動インクリメントとしてIDを宣言すればいいと思う。それ以前にsetAttributesメソッドでidを設定することで、それが問題かどうかを確認することができます。 –