2012-03-07 11 views
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; 
+0

あなたのtbl_typeテーブルにどの行が存在するかを教えてください。それはIDが1の行を持たないようです。 –

+0

ユニットテストを実行する前にテスト行(id:1、name:test)を追加しました – VeroLom

+0

ok。属性を設定するときに、テーブルの主キー(id)を渡していないことがわかります。 idを自動インクリメントとして宣言したこともありません。私はあなたの問題は、あなたが自動インクリメントとしてIDを宣言すればいいと思う。それ以前にsetAttributesメソッドでidを設定することで、それが問題かどうかを確認することができます。 –

答えて

0

これはテスト・データベースに問題があった。

return array(
     'goods' => array(self::HAS_MANY, 'Goods', 'item_id'), 
     'type' => array(self::BELONGS_TO, 'Type', 'type_id'), 
     'category' => array(self::BELONGS_TO, 'Category', 'category_id'), 
     'descTemplate' => array(self::BELONGS_TO, 'DescTemplate', 'desc_template_id'), 
    ); 

とSQLは、テーブルを作成します。私は作業データベースとデータを同期させ、すべてのテストに合格しました。

+0

あなたはそれを解決したので、あなた自身の答えを受け入れ、将来のユーザーに役立ちます –