【问题标题】:First 'find' call does not return associated data. Second 'find' call does第一次“查找”调用不返回相关数据。第二个“查找”电话确实
【发布时间】:2012-11-14 20:09:05
【问题描述】:

在模型“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)。第二个“find”调用确实返回 GradingPeriod 模型的关联数据(AcademicYear)。

class ReportCard extends AppModel {

   public function callToGradingPeriod(){

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

      $objGradingPeriod->getEnrolledSections();

   }

}

我已经在 CakePHP 2.1.2 和 2.2.3 上尝试过,结果相同。

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

【问题讨论】:

  • 在每个 findById() 之前尝试 debug($this->recursive);
  • 调试按预期返回1

标签: cakephp model cakephp-2.1


【解决方案1】:

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

永远不要使用recursive 来获取相关数据。在您的 AppModel 中设置 public $recursive = -1; 并且永不回头。当您需要相关数据时,请使用CakePHP's Containable Behavior

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

相信我 - 抛弃递归,改用contain()

【讨论】:

  • 是的,使用Containable是必须的,但是这个问题仍然是个谜。 :D @Rob 如果您使用的数据库是 MySQL,您可以尝试:$this->ModelName->query("COUNT(1)"); 在第一次查找之前执行此操作,看看情况是否有变化。听起来很疯狂,这将重建数据库的索引。 :D 我有点怀疑这可能会有所帮助。如果您拥有庞大的数据库,这可能会有所帮助。
  • 谢谢。非常好的建议。在发布之前,我实际上在简单的发现之前尝试了Containable,结果相同。为了清楚起见,我只是使用了问题中的简单发现。我的问题应该更细化。不幸的是,上述建议没有奏效。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-13
  • 2020-03-28
  • 1970-01-01
相关资源
最近更新 更多