Chr*_*pen 1 php zend-db zend-db-select zend-framework2
你如何(优雅地)使用Zend Framework 2中的闭包来按字段排序select语句?
我有以下PHP代码:
$gateway = new \Zend\Db\TableGateway\TableGateway('table_name', $adapter);
$select = $gateway->select(function($select){
$select->where->in('id', array(4, 2, 3, 1));
// insert some awesome ordering magic here..!
});
Run Code Online (Sandbox Code Playgroud)
我知道你可以很容易地做到这一点:
...
$select->order(array('id ASC'));
...
Run Code Online (Sandbox Code Playgroud)
但是,这只是按升序id值排序结果,我需要通过特定的id序列对它们进行排序(即:按序列排序)4, 2, 3, 1.
是否有一个优雅的Zend Framework 2功能,我可以在这里使用id它们自己订购?有效地创建SQL:
select * from table_name
where 'id' in (4, 2, 3, 1)
order by field('id', (4, 2, 3, 1));
Run Code Online (Sandbox Code Playgroud)
这是我发现通过字段在Zend 2中订购结果的最佳方法.如果您有任何建议/更好的方法,请提供您自己的解决方案!
我最终和Expression班级一起去做了想要的结果.要给出一个详细的例子,请看下面的PHP代码:
use Zend\Db\Sql\Expression;
// create the array of ID's we want to order by...
$ids = array(4, 2, 3, 1);
// get our table gateway and our select going...
// don't forget the 'use' syntax here...
$gateway = new \Zend\Db\TableGateway\TableGateway('table_name', $db_adapter);
$select = $gateway->select(function($select) use($ids){
// standard 'in' functionality...
$select->where->in('id', $ids);
// use an expression here to achieve what we're looking for...
$ids_string = implode(',', $ids); // assuming integers here...
$select->order(array(new Expression('FIELD (id, '. $ids_string .')')));
});
Run Code Online (Sandbox Code Playgroud)
希望这有时可以帮助某人!