在YII中保存相关(一对一)模型,参考父母

时间:2013-05-10 14:03:39

标签: yii

我在插入有父母的新记录时遇到了麻烦。

<?php
/**
 * This is the model class for table "tbl_a".
 * @property integer $id
....
 */

class A extends CACtiveRecord{


}
?>


<?php
/**
 * This is the model class for table "tbl_b".
 * @property integer $id
....
* The followings are the available model relations:
* @property A $a
 */

class B extends CACtiveRecord{
//codes...

/**
 * @return array relational rules.
 */
public function relations()
{
    // NOTE: you may need to adjust the relation name and the related
    // class name for the relations automatically generated below.
    return array(
    'a' => array(self::BELONGS_TO , 'A', 'id'),
    );
}   

}

?>

这是我的模型类的结构。 这里tbl_b的'id'被设置为主键,也是引用tbl_a的外键。 tbl_a的'id'是它的主键。

我的问题是,当我尝试保存B的模型对象($ b-&gt; save())后,设置除'id'之外的所有属性(但是对象的属性'a'[$ b ]设置有模型'A'的活动记录,表示具有主键10),因为没有设置'id'而在插入记录时抛出异常。但是当我在设置模型对象的'id'后尝试相同时,它正确插入。 为什么我们需要设置子模型的外键属性,即使设置了相关属性? 对此有什么解决方案吗?因此,外键引用id是从相关模型obj?

中自动获取的

提前致谢。

1 个答案:

答案 0 :(得分:0)

仅当您的数据库支持时才会自动生成。 Yii不会自己创造id。如果您使用MySQL作为RDMS,主键应标记为auto_increment。但在您的情况下,您使用外键作为主键。因此,最适合您的方法是重载beforeSave模型的B方法并将a::id提取为b::id

public function beforeSave()
{
    if (parent::beforeSave())
    {
        $this->id = $this->a->id;
        return true;
    }
    return false;
}