添加eager-loading后,Yii立即发生致命错误

时间:2012-07-06 04:25:56

标签: php yii eager-loading

我有3个CActiveRecord型号:

  • A
  • C

关系:

  • A有很多B。
  • A有很多C。
  • B属于A。
  • C属于A。

AController的{​​{1}}中,我正在从数据库中检索actionHome($id)的单行。就像默认的A

一样

在我的actionView($id)视图中,我还列出了属于actionHome()的{​​{1}}和B的所有实例。

C

A中,我想使用{strong>急切加载的public function actionHome($id) { $this->render('home', array('a' => A::model()->findByPk($id))); } 关系。

但是,当我向actionHome()函数添加A时,我立即收到致命错误。

with()

findByPk()我的public function actionHome($id) { $this->render('home', array('a' => A::model()->with('bs','cs')->findByPk($id))); } 查看文件。

Fatal error: Call to a member function label() on a non-object in是我在home.php模型类中的公共静态函数。

因此,由于我添加了预先加载,这会导致该功能无法使用。

有人可以协助吗? 为什么这个功能不再可用?

在我的视图home.php中调用

label(),如下所示:

A

label()在我的模型中定义如下:

$this->breadcrumbs = array(
  CHtml::encode($a->label(2)) => array('index'),
  CHtml::encode($a->name),
);

如果我在视图中注释掉label()的调用(或将调用更改为public static function label($n = 1) { if ( $n == 0 ) $n = 1; return Yii::t('app', 'A|As', $n); } ),则下一行也会触发错误,但“名称”不是非对象的属性。

显然,由于某种原因,label()不再是对象。

更新1:

添加A::label(2)会导致$a返回with(),因此我的视图中findByPk($id)NULL,所以我试图找到原因。延迟加载没有此问题。

1 个答案:

答案 0 :(得分:1)

findByPk()正在返回NULL,因为关系cs为空。 Yii正在从INNER JOINA执行B,因为没有B属于A,结果集为空。

延迟加载没有此问题,因为在需要B的数据之前,它不会执行查询。