我在symfony2框架中使用doctrine2。我想选择单个随机字段。我不想使用本机查询或使用 PHP 获取随机查询。
我试图根据
http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/cookbook/dql-user-defined-functions.html
https://gist.github.com/Ocramius/919465
在 config.yml 中连接的扩展函数
orm:
...
entity_managers:
default:
...
dql:
numeric_functions:
rand: MyProjectMyBundleDQLRand
我尝试在控制器中调用查询
$product= $em->createQueryBuilder('p')
->select('w')
->from('MyBundle:Product', 'p')
// ->orderBy('RAND ()') // I tried so
->addSelect('RAND() as HIDDEN rand') // and so
->orderBy('rand')
->getQuery()
->getSingleResult();
我也试过
$product = $em->createQuery('SELECT p FROM MyBundle:Product p ORDER BY RAND()')
->setMaxResults(1)
->getSingleResult();
我收到错误:
Error: Expected end of string, got '('
请注意,在查询中,"ASC"跟在"RAND()"之后。我试图调用orderBy('RAND()',''),但不成功...
使用此捆绑包: https://github.com/mapado/MysqlDoctrineFunctions
您可以使用 DQL 查询中的函数:
$query = 'SELECT RAND(), ROUND(123.45)
FROM ...
';
$em->createQuery($query);
但是你不能使用->orderBy
...
4.8.2. 我可以在 DQL 中按函数(例如 ORDER BY RAND()))排序吗?
否,不支持在 DQL 中按函数排序。如果需要此功能,则应使用本机查询或提出其他解决方案。作为旁注:从 1000 行开始,使用 ORDER BY RAND() 排序非常缓慢。
http://docs.doctrine-project.org/en/2.1/reference/faq.html#can-i-sort-by-a-function-for-example-order-by-rand-in-dql