1

我有3个CActiveRecord模型:

  • 一个
  • C

关系:

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

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

在我的 View for 中,我还列出了属于 that的和的actionHome()所有实例。BCA

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()在我的视图中调用 home.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)),那么下一行也会触发错误,..“名称”不是非对象的属性。

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

更新1:

因此,在我看来,将原因添加到 return ,所以我with()试图findByPk($id)找出原因。延迟加载没有这个问题。NULL$aNULL

4

1 回答 1

1

findByPk()正在返回,NULL因为关系cs为空。Yii 正在执行INNER JOINfrom AtoB并且因为没有B属于 的A,结果集是空的。

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

于 2012-07-06T08:19:38.360 回答