使用Magento中的函数是向带有函数的Filters添加反引号。有没有一种方法可以使这些MySQL功能工作?

时间:2016-09-14 17:16:04

标签: php mysql magento

我正在使用Magento 1,我正在尝试使用以下代码添加week(created_time)过滤器:

$week = 37;
$weekCollection = Mage::getModel('module/modle_name')->getCollection()
                        ->addFieldToFilter("week(created_time)", $week);

不幸的是,在整个函数周围添加了反引号,所以我得到了错误

  

SQLSTATE [42S22]:未找到列:1054'where子句'中的未知列'week(created_time)',查询为:SELECT`main_table`。*,SUM(委托)AS`commission_total` FROM`allminiateplus_transaction` AS `main_table` WHERE(`account_id` ='1546')AND(`week(created_time)`='37')GROUP BY周(created_time,1)

Magento 1中是否有合法的方法将MySQL函数应用于列名?

2 个答案:

答案 0 :(得分:3)

您必须使用Zend_Db_Expr。 如果magento遇到Zend_Db_Expr,它只会将其解析为字符串,不要以任何方式修改它。

所以它看起来像这样:

$week = 37;
$weekCollection = Mage::getModel('module/modle_name')->getCollection()
                    ->addFieldToFilter(new Zend_Db_Expr("week(created_time)"), $week);

答案 1 :(得分:1)

您需要先添加表达式属性。这是一种基于MySQL函数创建虚拟列的方法。

$week = 37;
$weekCollection = Mage::getModel('module/modle_name')->getCollection()
            ->addExpressionAttributeToSelect( 'match_week', 'week({{created_time}})', array( 'created_time' => 'created_time' ) )
            ->addFieldToFilter( 'match_week', $week);