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 模型内部调用时,这可以正常工作。第一个“查找”调用确实返回了 GradingPeriod 模型的关联数据 (AcademicYear)。

不同的模型调用时,第一个“查找”调用不会返回 GradingPeriod 模型的关联数据 (AcademicYear)。第二个“查找”调用确实返回了 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用来获取相关数据。设置public $recursive = -1;在您的 AppModel 中,永不回头。当您需要相关数据时,请使用CakePHP 的 Containable Behavior

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

相信我这一点 - 抛弃递归,并contain()改用。

于 2012-11-15T03:57:32.107 回答