如何获得这样的 Sql:
select * from foo where LOWER(foo_name) = 'test';
我得到的是如果 Sql\Expression 在右边,而不是在左边。
如何获得这样的 Sql:
select * from foo where LOWER(foo_name) = 'test';
我得到的是如果 Sql\Expression 在右边,而不是在左边。
您可以像这样使用代码片段。
$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 上是可能的。
你可以这样做:
$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');
对于寻找类似的其他人来说,实际上有很多不同的方法可以实现这一点,从 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'
?>