添加急切加载后立即在 Yii 中出现致命错误


Fatal error in Yii immediately after adding eager-loading

我有 3 个CActiveRecord模型:

  • 一个
  • C

关系:

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

AControlleractionHome($id)中,我正在从数据库中检索单行A。就像默认actionView($id)一样。

在我的 View for actionHome() 中,我还列出了属于该A的所有BC实例。

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视图文件。

label()是我在A模型类中的一个公共静态函数。

因此,由于我添加了预先加载,这会导致函数不可用。

有人可以帮忙吗?
为什么此功能不再可用?

label()在我的视野中被称为家.php如下所示:

$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()的调用(或将调用更改为A::label(2)),那么下一行也会触发错误,..即"name"不是非对象的属性。

显然,出于某种原因,$a不再是一个对象。

更新 1:

添加with()会导致findByPk($id)返回NULL,因此在我看来$a NULL,所以我试图找到原因。延迟加载没有此问题。

findByPk()返回NULL,因为关系cs为空。Yii 正在做一个从 ABINNER JOIN,因为没有属于 AB,所以结果集是空的。

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