我目前正在使用CakePHP中的应用程序来显示(但不能修改)旧数据库的内容。我无法以任何方式更改数据库结构。
我正在使用六个表格,这个糟糕的油漆图中列出了关系:
我目前已将模型定义如下:
(我决定将它放在PasteBin中,因为它有点像文字墙,如果愿意,我很乐意将其编辑到帖子中。)
我想要做的是使用一个控制器将来自我的控制器的相关链接数据从基本上所有这些表传递到视图。但是,即使我将递归设置为2,链接似乎只是到目前为止 - 例如,如果我尝试使用以下代码从'Ctit'表中查找数据:
$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
答案 0 :(得分:1)
所以......凝结了评论。
基本上这是一个可以容忍的问题。要获得与单个模型(意思是其他5个模型)相关的所有,一种方法就像
$this->Ctit->find('all', array(
'contain' => array(
'Royalty',
'Title',
'Contract' => array('Publisher', 'Territory')
)
您还可以像其他任何查询一样向该数组添加选项,例如order
,fields
,conditions
等。
例如:
$this->Ctit->find('all', array(
'contain' => array(
'Royalty' => array('order' => 'id DESC'),
'Title' => array('fields' => array('id', 'name'),
'Contract' => array('Publisher',
'Territory' => array('conditions' => array('name' => 'terr'))
)
要记住的一件事是始终使用
public $actsAs = array('Containable');
(请注意actsAs
中的 s ,有些人因此而遇到麻烦)否则你的模特不会表现得很严重,你会认为这件事情并不存在工作。
包含行为对此非常有用,因为您不必执行大量查找,但请记住,蛋糕会在场景后面进行大量查询以使用可包含的内容。如果您希望这只是一个大查询,请使用joins(找到它!)
另外,请注意此查询可能会非常快速。您基本上要求所有 5个关联的所有记录,当您达到内存限制通知时,您将记住我。我怀疑你想在一个视图上显示每个记录的所有数据,所以重新考虑,可能先是一个简单的分页,然后是每个单个记录的单个视图(在这种情况下) ,查找将是find('first')
,并且比find('all')
好很多。