Magento管理网格字段自定义筛选器问题

时间:2017-04-07 04:50:03

标签: php mysql magento

我创建了带有网格的Magento Admin模块和具有自定义过滤器的字段。

    $this->addColumn('diff', array(
        'header'    =>'Diff.',
        'align'     =>'left',
        'type' => 'number',
        'index'     =>'diff',
        'filter_condition_callback' => array($this, '_diffFilter'),
    ));

具有以下组的集合:

$collection->getSelect()->group(array('main_table.order_id'));

自定义过滤功能如下:

protected function _diffFilter($collection, $column) {
    if (!$value = $column->getFilter()->getValue()) {
        return $this;
    }
    $_filter_data = $column->getFilter()->getValue();               

    if($_filter_data["from"]!=''){
        $collection->getSelect()->having('ROUND((main_table.base_cost-main_table.base_price)*100/main_table.base_cost) >= ?', $_filter_data["from"]);           
    }

    if($_filter_data["to"]!=''){
        $collection->getSelect()->having('ROUND((main_table.base_cost-main_table.base_price)*100/main_table.base_cost) <= ?', $_filter_data["to"]);
    }

    return $this;
}

使用此功能,如果我加载管理网格,它会抛出以下错误: SQLSTATE[42S22]: Column not found: 1054 Unknown column 'main_table.base_cost' in 'having clause'

但是我使用这个选择查询$collection->getSelect()然后直接运行到MySQL,它运行正常,但它只是从Magento抛出错误。

我做了很多研究,但它与Magento完全无法合作。

1 个答案:

答案 0 :(得分:0)

HAVING子句用于过滤分组查询的结果。如果要筛选表中的列,请使用WHERE子句:

protected function _diffFilter($collection, $column) {
    if (!$value = $column->getFilter()->getValue()) {
        return $this;
    }
    $_filter_data = $column->getFilter()->getValue();               

    if($_filter_data["from"]!=''){
        $collection->getSelect()->where('ROUND((main_table.base_cost-main_table.base_price)*100/main_table.base_cost) >= ?', $_filter_data["from"]);           
    }

    if($_filter_data["to"]!=''){
        $collection->getSelect()->where('ROUND((main_table.base_cost-main_table.base_price)*100/main_table.base_cost) <= ?', $_filter_data["to"]);
    }

    return $this;
}