2

以下はモデル「GradingPeriod」で宣言されています。

class GradingPeriod extends AppModel {

   public $belongsTo = array('AcademicYear' => array('className' => 'AcademicYear', 'foreignKey' => 'academic_year_id'));

   ...

   public function getEnrolledSections(){

      $this->recursive = 1;

      debug($this->findById(21)); // Does **not** return AcademicYear
                                  // model data when function is called 
                                  // from a different model.

      debug($this->findById(21)); // **Does** return AcademicYear
                                  // model data when function is called  
                                  // from a different model.

      die();
   }
}

コントローラーから、または GradingPeriod モデル内で呼び出された場合、これは正常に機能します。最初の 'find' 呼び出し、GradingPeriod モデルの関連データ (AcademicYear) を返します。

別のモデルから呼び出された場合、最初の 'find' 呼び出しはGradingPeriod モデルの関連データ (AcademicYear) を返しません。2 番目の「find」呼び出し、GradingPeriod モデルの関連データ (AcademicYear) を返します。

class ReportCard extends AppModel {

   public function callToGradingPeriod(){

      $objGradingPeriod = ClassRegistry::init('GradingPeriod');

      $objGradingPeriod->getEnrolledSections();

   }

}

CakePHP 2.1.2 と 2.2.3 でこれを試してみましたが、同じ結果が得られました。

あるモデルから別のモデルを呼び出すことは悪い形式と見なされる可能性があることは知っていますが、なぜこのコードはそのように動作するのでしょうか? ご提供いただけるご支援をよろしくお願いいたします。

4

1 に答える 1

0

これは、なぜそれがそのように機能している(または機能していない)のかという点では実際には答えではありませんが、あなたと将来のユーザーが同様のことを試みている場合の提案です:

recursive関連するデータを取得するために使用しないでください。AppModelに設定public $recursive = -1;し、決して振り返らないでください。関連データが必要な場合は、CakePHPのContainableBehaviorを使用してください。

再帰的であるように見えるかもしれません-またはそれは「ただ簡単」ですが、より多くのデータが必要な場合、またはデータベースにさらに多くのデータを取得した場合(メモリの問題/とりわけエラー)。これは悪い習慣であり、CakePHP3+では再帰をすべて一緒に削除することさえあると思います。

これを信じてください-再帰的な溝を作り、contain()代わりに使用してください。

于 2012-11-15T03:57:32.107 に答える