2013-07-19 52 views
0

所以我正在做一些單元測試和關係裝置。Yii動態模型ID

我動態創建一個模型,如:

$model = CActiveRecord::model('Post'); 
$post = $model->findByPk(1); 

但在那之後,我不能因爲某些原因得到$post->id。我將問題追溯到CActiveRecord類:

public function __get($name) 
{ 
    if(isset($this->_attributes[$name])) 
     return $this->_attributes[$name]; 
... 

其中$name = "id"。它說$this->_attributes[$name]不存在!事實上_attributes是空的。

我的帖子類沒有定義id(或任何其他屬性)作爲公共財產,我也不想這樣做。我只是讓AR將它映射到表格列。

我錯過了什麼?

編輯1

我的燈具是常規的Yii燈具 - 沒有什麼特別之處他們。

不同的是我真正加載它們的方式。我擴展了CDbFixtureManager,以便能夠通過重載load()方法來指定它們應該加載的順序。的實際利率失敗唯一的事情是,在有外鍵燈具我使用以下命令:

'comment1' => array('post_id' => $this->getRecord('Post', 'post1')->id);

這就是失敗。 getRecord返回實際的Post記錄(因爲我知道Post fixture已經成功加載並存在於數據庫中),但是在->id部分,我得到關於該屬性不存在的例外。

如果我進入Post模型並將public $id;添加到它,那麼一切正常!但我不確定這是否是好的做法,去宣佈所有屬性公開那樣。

+1

你可以發佈你的燈具文件以及你的測試嗎?很難說這是怎麼回事... – acorncom

+0

@acomcom,我在說明中加了編輯1。 –

回答

0

我想我找到了這個問題的根源。當我的FixtureManager使用DBConnection時,模型仍然使用常規的模型。

無論出於何種原因,我的調試器給了我誤導性的錯誤,如我在原始文章中描述的錯誤。

一旦我能夠在單元測試中設置所有模型的DBConnection,拼圖會卡入到位,一切都可以順利進行!

0

如果你看看這個頁面仔細: http://www.yiiframework.com/doc/guide/1.1/en/test.unit

,你會看到,他們使用數組形式檢索燈具:

$this->posts['sample1']['id'] 

有其固定陣列定義爲每一個別名記錄和夾具物品並不像模型那樣裝載...

這有幫助嗎?如果沒有,這將有助於看到你的夾具文件:-)

+0

嗨,對於遲到的回覆感到抱歉。就是這樣 - 我不想知道帖子得到了哪個ID。這是我不想明確設置該參數。通過使用'getRecord' _after_加載Post fixture,您可以從數據庫獲取該記錄,並因此讀出正確的ID。 –