在zend 框架 1中,我们使用了下面的 mysql rand()函数或使用zend_db_expr()。我已经在ZF2中尝试过,但这不起作用。有人请帮我在Zend Framework 2中使用它
$select = $this->db()->select()
->from('TABLE')
->order('RAND()');
谢谢,
在zend 框架 1中,我们使用了下面的 mysql rand()函数或使用zend_db_expr()。我已经在ZF2中尝试过,但这不起作用。有人请帮我在Zend Framework 2中使用它
$select = $this->db()->select()
->from('TABLE')
->order('RAND()');
谢谢,
查看 API,order 函数似乎接受一个字符串或参数数组order(string | array $order)
。我的第一个想法是使用 key/val 数组。但是,当我查看 Db\Sql\Select 的实际代码时,您传递的字符串或数组会被引用(参见此处)。假设您的 Db 平台是 Mysql,这是引用字段的函数(请参见此处)。它似乎遍历每个字段,并添加这些引号,使您的 rand() 函数成为无用的字符串。
言归正传,解决方案取决于您,但您似乎无法使用当前版本的 ZF2 以您想要的方式做到这一点。
您将需要扩展 Db\Sql\Select 类,或者扩展 Db\Adapter\Platform\Mysql 类,或者更改这些类中的代码,或者将查询作为完整的选择语句执行,或者更改您的逻辑。
通过改变你的逻辑我的意思是,例如,如果你的表有一个整数主键,那么首先从表中选择 MAX(id)。然后,在执行查询之前在 PHP 中选择您的随机数,以$ids[] = rand(1, $max)
获取尽可能多的结果。然后你的 sql 逻辑看起来像SELECT * FROM table WHERE id IN(453, 234, 987, 12, 999)
。结果相同,只是逻辑不同。无论如何,Mysql 的 rand() 非常“昂贵”。
希望这可以帮助!
在这里你可以使用\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;
}