我有 3 个CActiveRecord
模型:
- 一个
- 乙
- C
关系:
- A 有很多 B。
- A 有很多 C。
- B 属于 A。
- C 属于 A。
在AController
的actionHome($id)
中,我正在从数据库中检索单行A
。就像默认actionView($id)
一样。
在我的 View for actionHome()
中,我还列出了属于该A
的所有B
和C
实例。
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 正在做一个从 A
到 B
的INNER JOIN
,因为没有属于 A
的B
,所以结果集是空的。
延迟加载没有这个问题,因为它在需要来自B
的数据之前不会执行查询。