1

我想使用 ZF2 的 tableGateway 获得以下类型的查询。

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'。有解决方法吗?

编辑

当我 var_dump-ed sql 字符串时,我得到以下信息:

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 放在`引号中并将其视为列。所以问题是如何禁用它?

4

1 回答 1

1

感谢这个问题,我想通了。只需要将 IF 语句放入 中Expression,如下所示:

$select->columns(array('id',  new Expression("IF(column1 LIKE '{$keyword}', 1, 0)")), false)
于 2013-09-24T12:35:45.957 回答