2013-05-10 4 views
0

У меня возникли проблемы при вставке новой записи с родителем.Сохранить связанный (один к одному) Модель в 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'), 
    ); 
} 

} 

?> 

Это - структура классов моей модели. здесь 'id' tbl_b задан как первичный ключ, а также внешний ключ, ссылающийся на tbl_a. 'id' tbl_a является его основным ключом.

Моя проблема здесь в том, когда я попытался сохранить объект модели B ($ b-> save()) после установки всех атрибутов, исключая 'id' (Но свойство 'a' объекта [$ b ] устанавливается с активной записью модели «A», имеющей первичный ключ 10), исключение бросается на вставку записи из-за того, что для нее не установлен «id». Но когда я попробовал то же самое после установки «id» объекта модели, он вставил правильно. Почему нам нужно установить атрибут внешнего ключа дочерней модели, даже заданное свойство? Есть ли решение для этого. Так что идентификатор ссылки внешнего ключа берется автоматически из соответствующей модели obj?

Заранее спасибо.

ответ

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; 
} 
Смежные вопросы