CakePHP包含不与递归一起使用

时间:2012-02-29 18:54:43

标签: cakephp model cakephp-1.2 containable

当我尝试:

// Removed the limit to ensure that all of the group notes items can be found and collapsed
$recent_notes = $this->User->Note->find('all', array(
    'recursive' => 2,
    'order' => 'Note.created DESC',
    'conditions' => $conditions,
    'contains' => array(
        'NotesUser', 'Poster', 'Comment' => array('Poster')
    )
));

它不会限制输出 - 我得到每个相关的模型。但是,如果我未将recursive指定为2,或者我将其指定为1,则我会错过Comment=>Poster模型。

我怎样才能获得我需要的模型?谢谢!

3 个答案:

答案 0 :(得分:8)

要仅获取所需的模型,请使用[Containable behavior]

  • 将递归设置为-1
  • 使用'contain'单数,非'contains'复数,就像你有
  • 一样
  • 确保您在模型中设置$actsAs变量:public $actsAs = array('Containable');

我认识的每个人都在AppModel中设置$this->recursive = -1; ...这默认所有内容都是递归-1所以你不必再次设置它,除非你想要包含更多的数据......并且在某些情况下,我几乎总是使用contain(),而不是$recursive

答案 1 :(得分:2)

设置包含后,将忽略递归。

来自文档:

  

ContainableBehavior有许多可以在何时设置的选项   行为附加到模型。设置允许您罚款   调整Containable的行为并更多地处理其他行为   容易。

     

recursive (boolean, optional)设置为true以允许包含   自动确定获取所需的递归级别   指定模型,并将模型递归设置为此级别。   将其设置为false将禁用此功能。默认值为true。

确保数组键设置为“包含”,而不是上面发布的“包含”,如下所示:

$this->Post->find('all', array('contain' => 'Tag'));

我还假设您正在加载并正确附加可包含的行为。如果您遇到问题,则文档为here

答案 2 :(得分:1)

例如,如果您有深层关联 历史属于仓库和仓库所属公司 而你只想要Warehouse.Company,你也可以使用

'contain'   => array('Warehouse.Company')