ZF2表格在列中选择IF()

时间:2013-09-24 08:06:48

标签: php sql if-statement zend-framework2

我希望使用其tableGateway获得以下类型的ZF2查询。

SELECT IF(column1 LIKE 'text', 1, 0)
FROM table
WHERE (column1 LIKE 'text' OR column2 LIKE 'text') AND status = 1

有可能实现这一目标吗?我尝试了以下内容:

$this->tableGateway->select(function (Select $select) use ($keyword) {

    $select->columns(array('id', "IF(column1 LIKE '{$keyword}', 1, 0)"), false)
           ->where(array(
                    new Predicate(
                        array(
                             new Like('column1', '%'.$keyword.'%'),
                             new Like('column2', '%'.$keyword.'%')

                         ),
                         Predicate::COMBINED_BY_OR
                    ),
                 'status' => 1
            ));
        });

但这会导致错误Unknown column 'IF(column1 LIKE 'test', 1, 0)' in 'field list'。 有解决方法吗?

修改

当我对sql String进行var_dump-ed时,我得到了以下内容:

SELECT `id` AS `id`, `IF(table.column1 LIKE 'test', 1, 0)` AS `IF(table.column1 LIKE 'test', 1, 0)` 
FROM `table`
WHERE (`table`.`column1` LIKE '%test%' OR `table`.`column2` LIKE '%test%') 
      AND `table`.`status` = '1';

所以它将我的IF放在`引号中并将其视为列。所以问题是如何禁用它?

1 个答案:

答案 0 :(得分:1)

感谢this question我明白了。只需将IF语句放在Expression中,如下所示:

$select->columns(array('id',  new Expression("IF(column1 LIKE '{$keyword}', 1, 0)")), false)