在CakePHP中关联多个模型
我目前正在使用CakePHP开发一个应用程序,以显示(但不修改)遗留数据库的内容。我无法以任何方式更改数据库结构 我正在处理六个表,这些关系在这张糟糕的绘制图中概述: 我目前对模型的定义如下: (我决定把它放在一个粘贴箱里,因为它有点像一堵文字墙,如果愿意,我很乐意将它编辑到帖子中) 我想做的是使用一个控制器将相关链接数据从我的控制器传递到基本上所有这些表的视图。然而,即使我将recursion设置为2,链接似乎也只会走这么远——例如,如果我尝试使用如下代码从“Ctit”表中查找数据:在CakePHP中关联多个模型,cakephp,model,associations,Cakephp,Model,Associations,我目前正在使用CakePHP开发一个应用程序,以显示(但不修改)遗留数据库的内容。我无法以任何方式更改数据库结构 我正在处理六个表,这些关系在这张糟糕的绘制图中概述: 我目前对模型的定义如下: (我决定把它放在一个粘贴箱里,因为它有点像一堵文字墙,如果愿意,我很乐意将它编辑到帖子中) 我想做的是使用一个控制器将相关链接数据从我的控制器传递到基本上所有这些表的视图。然而,即使我将recursion设置为2,链接似乎也只会走这么远——例如,如果我尝试使用如下代码从“Ctit”表中查找数据: $t
$this->set('contracts',$this->Ctit->find('all',
array(
'recursion' => 2,
'conditions' => array('Title.TITNO' => $id),
'fields' => array('Contract.CONNO','Title.TITLE','Contract.CONDATE','Territory.DESCRIPTION')
)
));
结果查询不包括“Territory”表,因此会抛出一个错误
我做错了什么?是否有可能以这种方式检索数据,或者我可能必须运行多个查找或编写自己的查询(这是我希望避免的)
提前感谢,
Kez所以。。。浓缩评论 基本上这是一个可以控制的问题。要获得与单个模型(即其他5个模型)相关的所有内容,方法如下
$this->Ctit->find('all', array(
'contain' => array(
'Royalty',
'Title',
'Contract' => array('Publisher', 'Territory')
)
您还可以向该数组添加选项,就像任何其他查询一样,例如顺序
,字段
,条件
,等等。例如: 要记住的一件事就是要经常使用
public $actsAs = array('Containable');
(请注意,s在actsAs
中,有些人因此遇到了麻烦)否则,您的模型将无法正常运行,您可能会认为整个过程都不起作用
Containable行为在这方面很有用,因为您不必进行大量查找,但请记住,cake在幕后执行大量查询以使用Containable。如果您希望这只是一个大查询,请使用(找到它!)
另外,请注意,此查询可能会很快变大。你基本上是在要求所有5个关联的记录,当你达到记忆限制时,你会记住我。我怀疑您是否希望在一个视图中显示每个记录的所有数据,因此请重新考虑,可能先进行简单的分页,然后为每个记录显示一个视图(在这种情况下,查找将是
find('first')
,这比find('all')要好得多)
您尝试过使用吗?感谢您的回复。但是,我可能误解了可包含行为的工作原理,它是否有助于限制返回的结果数?当我尝试扩展它们时。我尝试启用它并添加“$this->Ctit->contain('Territory.DESCRIPTION');”,然后我得到一个错误,上面写着:Model“Ctit”与模型“Territory”不关联[CORE\Cake\model\Behavior\ContaineableBehavior.phpIt限制结果,如果您愿意的话(这通常是您想要的),但如果您设置嵌套的包含
,它可以永远扩展它们。本质上,它使您能够决定从数据库中检索到什么,而不是递归
选项。您的另一个选项是使用联接(总是很难找到指向该文档的链接,但要查找它)。无论您选择哪种方式,请记住,您希望一次检索6个模型的数据…这将快速升级(例如,如果您希望查找(全部)而不是查找(首先)。(请阅读评论的其他部分).Ctit与地区无关;Citit与合同和合同到地区有关,因此您必须执行$this->Ctit->find('first',array('contain'=>array('Contract'=>'Territory'))
是的,请阅读我提供的完整文档,特别是其中的一部分。
public $actsAs = array('Containable');