2

zend 框架 1中,我们使用了下面的 mysql rand()函数或使用zend_db_expr()。我已经在ZF2中尝试过,但这不起作用。有人请帮我在Zend Framework 2中使用它

$select = $this->db()->select()
        ->from('TABLE')
        ->order('RAND()');

谢谢,

4

2 回答 2

2

查看 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() 非常“昂贵”。

希望这可以帮助!

于 2013-05-09T17:46:20.737 回答
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;

    }
于 2013-06-10T17:18:53.253 回答