在Zend Framework 2中按字段排序SQL

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)

Chr*_*pen 6

这是我发现通过字段在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)

希望这有时可以帮助某人!