以下是在模型'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中尝试了相同的结果。
我知道从另一个模型中调用一个模型可能被认为是不好的形式,但为什么这个代码表现得像它一样?提前感谢您提供的任何帮助。
答案 0 :(得分:0)
对于为什么它的工作方式(或不工作方式),这不是一个真正的答案,而是对你和任何尝试类似事情的未来用户的建议:
不要使用recursive
来获取关联数据。在AppModel中设置public $recursive = -1;
,永不回头。如果需要相关数据,请使用CakePHP's Containable Behavior。
看起来像递归是你的朋友 - 或者说它“更容易”,但我保证它会引发更多问题 - 无论是你想要更多数据,还是只是当你在数据库中获得更多数据时内存问题/错误等)。这是不好的做法,我相信他们甚至会在CakePHP 3 +中一起删除递归。
相信我这个 - 沟渠递归,而是使用contain()
。