2012-10-09 35 views
0

我有模型:项目=>关键字CakePHP根据数组筛选相关模型

使用HMBTM关系(在两个模型中设置)。

关键字表充当一个树,即。这些关键字之间具有层次关系。

我正在使用可容忍的行为。

用户选择关键字。

我希望返回的记录(项目)受所选关键字或任何关键字的子项限制。我试图重用我的索引操作..如果没有选择关键字,则渲染标准索引视图,如果选择关键字,则查找所有子关键字,然后将返回的项目过滤为具有任何关键字标识的项目。

我曾尝试创建一个儿童(和原始)关键字ID的数组,但我无法弄清楚如何让该数组成为我的查找动作中的过滤。

我已经尝试使用:

$this->Project->find('all', 
    array(
     'contain' => array('Keyword.id'=>array($childkeywords))  
    ) 
); 

其中$ childkeywords是相关ID的排列,创建使用array_push。但是,这不使用键值对,只是每个ID的int值。所以我认为它的结构不正确。

我觉得我想要做一些很容易的事情,但是感觉我越来越远离解决方案。是否没有一种标准的方法将记录限制为相关模型的ID集合?

干杯

与圣保罗的帮助,我现在有:

$this->Project->find('all', array(
            'fields' => array('id','title','country', 'project_ref'), 
            'type' => array('inner'), 
            'contain' => array('Keyword' => array(
                   'conditions' => array('Keyword.id' => $childkeywords)            
                      ) 
                ) 
              ) 
           ) 

但使用类型内的是不会改变的结果..

回答

0

你应该有这样的事情:

$this->Project->find('all', array(
    'contain' => array('Keyword' => array(
       'conditions' => array('Keyword.id' => $childkeywords) 
      ) 
    ) 
)); 
+0

Paulo,感谢这真的帮助..我的代码现在停止崩溃,但是当我调试创建的数组时,它显示所有项目和匹配搜索ID的项目显示关联的关键字。我需要的是摆脱没有任何关联,匹配关键字的项目。 虽然这感觉真的很接近!这感觉就像一个左外和内连接问题 - 不知道如何解决这个问题。 –

+0

我曾尝试将'type'=>数组('inner')添加到参数列表中,但这并没有改变。 –

+0

是的,你可以添加''type'=>'inner'',但是应该在'Keyword'模型中添加'$ belongsTo'数组。你试过了吗? –

0

尝试这样:

$this->Project->Keyword->find('all', array(
    'conditions' => array(
     'Keyword.id' => array(1, 2, 3, 4) 
    ) 
)); 

在这种情况下,您不需要使用Containable。您可以尝试TreeBehavior

+0

嗨Bancer 此解决方案似乎为每个关键字返回一行,是否使用过,如果有关联的项目,那么详细信息存在..再次,不是我所希望的。 我对设置的关键字有树形行为。不知道如何在这个问题的上下文中使用它.. –

+0

你可以设置'recursive'为'0'或'-1'来限制检索相关记录。将“1,2,3,4”替换为您需要检索的关键字ID。 – bancer