1

私は3つCActiveRecordのモデルを持っています:

  • B

関係:

  • AにはBがたくさんあります。
  • AにはCがたくさんあります。
  • BはAに属しています。
  • C は A に属します。

では、データベースからAControlleractionHome($id)1 行を取得しAています。デフォルトのようにactionView($id)

のビューでは、それに属すると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モデルクラス内にある public static 関数です。

そのため、熱心な読み込みを追加したため、これにより関数が使用できなくなります。

誰か助けてくれませんか?
この機能が利用できなくなったのはなぜですか?

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()が返されます。Yii はfrom toを実行しており、 に属するがないため、結果セットは空です。NULLcsINNER JOINABBA

遅延読み込みでは、データが必要になるまでクエリを実行しないため、この問題はありませんBでした。

于 2012-07-06T08:19:38.360 に答える