首次“查找”调用不会返回关联数据。第二次“找到”电话会

时间:2012-11-14 20:09:06

标签: cakephp model cakephp-2.1

以下是在模型'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模型内部调用时,这很好用。第一个“查找”调用确实返回GradingPeriod模型的关联数据(AcademicYear)。

当从不同模型调用时,第一个'find'调用不会返回GradingPeriod模型的关联数据(AcademicYear)。第二个“查找”调用确实返回GradingPeriod模型的关联数据(AcademicYear)。

class ReportCard extends AppModel {

   public function callToGradingPeriod(){

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

      $objGradingPeriod->getEnrolledSections();

   }

}

我在CakePHP 2.1.2和2.2.3中尝试了相同的结果。

我知道从另一个模型中调用一个模型可能被认为是不好的形式,但为什么这个代码表现得像它一样?提前感谢您提供的任何帮助。

1 个答案:

答案 0 :(得分:0)

对于为什么它的工作方式(或不工作方式),这不是一个真正的答案,而是对你和任何尝试类似事情的未来用户的建议:

不要使用recursive来获取关联数据。在AppModel中设置public $recursive = -1;,永不回头。如果需要相关数据,请使用CakePHP's Containable Behavior

看起来像递归是你的朋友 - 或者说它“更容易”,但我保证它会引发更多问题 - 无论是你想要更多数据,还是只是当你在数据库中获得更多数据时内存问题/错误等)。这是不好的做法,我相信他们甚至会在CakePHP 3 +中一起删除递归。

相信我这个 - 沟渠递归,而是使用contain()