如何在CakePHP中累积过滤数据

时间:2013-02-10 10:43:57

标签: cakephp

我对CakePHP和面向对象编程相对较新。我之前在CakePHP中构建了应用程序,但从未达到过这种程度,因此我正在寻求帮助。

我有一个大型产品管理数据库,用户需要能够设置过滤条件以找到最接近的产品匹配。

products表包含与各个表相关的category_id,manufacturer_id,type_id,status_id。

我有一个侧边栏,每个过滤器都有下拉框,并且希望所有过滤器一起工作,例如,如果选择了制造商和产品类型,则显示这些过滤结果,并将状态和类别下拉列表更改为仅包含来自已过滤结果的选项。

过去我通过使用基于用户输入的动态查询设置条件完成此操作,每次应用过滤器时附加where子句。

到目前为止,我只能使用

获得单独过滤的结果
$this->Product->recursive = 0;
    $mid = (isset($this->params['named']['mid'])) ? $this->params['named']['mid'] : '';
    if(!empty($mid)){
        $this->paginate = array(
            'conditions' => array('Product.manufacturer_id' => $mid),
            'limit' => 10
        );
    }
    $products = $this->paginate('Product');
    $this->set(compact('products'));

其中'mid'是制造商ID,这是在url中手动输入'mid'

如果用户设置category_id,manufacturer_id,type_id,status_id或任何组合,如何获得累积过滤结果?我会用什么查询来重新填充下拉列表?

(最终我将使用ajax,但现在假设我有4个带提交按钮的下拉框)

1 个答案:

答案 0 :(得分:1)

漫长的道路将是:

var $conditions = array();

if (isset($this->params['named']['mid']) && !empty($this->params['named']['mid'])){
   $conditions['Product.manufacturer_id'] = $this->params['named']['mid']);
}
if (isset($this->params['named']['catid']) && !empty($this->params['named']['catid'])){
   $conditions['Product.category_id'] = $this->params['named']['catid']);
}
if (isset($this->params['named']['statid']) && !empty($this->params['named']['statid'])){
   $conditions['Product.status_id'] = $this->params['named']['statid']);
}

$this->paginate['conditions'] = $conditions;
$this->paginate['limit'] = '10';
$this->set('products', $this->paginate('Product'));

一旦掌握了这一点,就可以将所有支票放入循环中。