2013-07-19 86 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。 –