在 zend framework 1 中,我们使用了如下所示的mysql rand()函数或使用 zend_db_expr()。我在 ZF2 中尝试了这个,但这不起作用。有人请帮我在 Zend Framework 2
中使用它$select = $this->db()->select()
->from('TABLE')
->order('RAND()');
谢谢,
答案 0 :(得分:2)
查看API看来,order函数接受一个字符串或参数数组order(string | array $order)
。我的第一个想法是使用键/ val数组。但是,当我查看Db \ Sql \ Select的实际代码时,您传递的字符串或数组将被引用(see here)。假设您的Db平台是Mysql,这是引用字段(see here)的函数。它似乎遍历每个字段,并添加这些引号,使您的rand()函数成为无用的字符串。
说实话,解决方案取决于您,但似乎您无法以当前版本的ZF2的方式执行此操作。
您需要扩展Db \ Sql \ Select类,或者扩展Db \ Adapter \ Platform \ Mysql类,或者更改这些类中的代码,或者将查询作为完整的select语句执行,或者更改你的逻辑。
通过更改逻辑,我的意思是,例如,如果您的表有一个Integer主键,那么首先从表中选择MAX(id)。然后,在执行查询之前,在PHP中选择随机数,例如$ids[] = rand(1, $max)
,以获得所需数量的结果。然后你的sql逻辑看起来像SELECT * FROM table WHERE id IN(453, 234, 987, 12, 999)
。同样的结果,只是不同的逻辑。无论如何,Mysql的rand()非常“昂贵”。
希望这有帮助!
答案 1 :(得分:2)
在这里你可以使用\ Zend \ Db \ Sql \ Expression。 ModelTable的示例函数:
public function getRandUsers($limit = 1){
$limit = (int)$limit;
$resultSet = $this->tableGateway->select(function(Select $select) use ($limit){
$select->where(array('role' => array(6,7), 'status' => 1));
$rand = new \Zend\Db\Sql\Expression('RAND()');
$select->order($rand);
$select->limit($limit);
//echo $select->getSqlString();
});
return $resultSet;
}