9

如何获得这样的 Sql:

select * from foo where LOWER(foo_name) = 'test'; 

我得到的是如果 Sql\Expression 在右边,而不是在左边。

4

3 回答 3

18

您可以像这样使用代码片段。

$where = new Where();
$sql = new Sql($adapter);
$select = $sql->select();
$where->addPredicate(new Predicate\Expression('LOWER(foo_name) = ?', 'test' ));
$select->from('foo')->where($where);

但是我不认为右侧的 Sql\Expression 在 Zend Framework 2 上是可能的。

于 2013-01-07T10:58:56.600 回答
5

你可以这样做:

$sql = new SQL($adaptor);
$select = $sql->select()->from(array('f'=>'foo'));
$select = $select->where('foo_name' => new \Zend\Db\Sql\Expression("LOWER('test')"));

上面的查询将返回为:

SELECT `f`.* FROM `foo` AS `f` WHERE `foo_name` = LOWER('test');
于 2013-11-11T08:46:40.243 回答
0

对于寻找类似的其他人来说,实际上有很多不同的方法可以实现这一点,从 ZF 2.2 开始

链接(与接受的答案相同)

<?php
$sql = new Sql($adapter);
$select = $sql->select();
$select->from( array( 'f' => 'foo' ) )
->where
->addPredicate( new Predicate\Expression( 'LOWER(f.foo_name) = ?', 'test' ) );

//SELECT `f`.* FROM `foo` AS `f` WHERE LOWER(f.foo_name) = :where1
//:where1 = 'test'
?>

注意 Select::$where 的执行命令“()”的缺失允许您继续方法链接。Select::$where 有一个 __get Magic 方法 catch,它返回 Select 对象中受保护的 Select::$_where 属性,该对象是 Sql\Where 的一个实例。

谓词\字面量 1

<?php
$select->where( "LOWER(f.foo_name) = 'test'" );

//SELECT `f`.* FROM `foo` AS `f` WHERE LOWER(f.foo_name) = 'test'
?>

谓词\字面量 2

<?php
$select->where( array( "LOWER(f.foo_name) = 'test'" ) );

//SELECT `f`.* FROM `foo` AS `f` WHERE LOWER(f.foo_name) = 'test'
?>

如果提供给 Select::where 方法的数组或参数的索引值(列标识符)是字符串,则上述两个会自动为您创建一个 Predicate\Literal 对象。

谓词\表达式(手动)

<?php
$select->where( new Predicate\Expression( "LOWER(f.foo_name) = 'test'" ) );

//SELECT `f`.* FROM `foo` AS `f` WHERE LOWER(f.foo_name) = 'test'
?>
于 2014-01-15T18:57:45.320 回答