doctrine2:如何使用随机自定义函数?

时间:2014-02-28 13:22:44

标签: symfony doctrine-orm dql

我在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: MyProject\MyBundle\DQL\Rand

我尝试在控制器中调用查询

    $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()',''),但不成功......

1 个答案:

答案 0 :(得分:1)

使用此捆绑包:https://github.com/mapado/MysqlDoctrineFunctions

您可以使用DQL查询中的功能:

$query = 'SELECT RAND(), ROUND(123.45) 
    FROM ...
';

$ EM->的createQuery($查询);

但你不能使用->orderBy ...

  

4.8.2。我可以通过DQL中的函数(例如ORDER BY RAND())进行排序吗?

     

不支持在DQL中按功能排序。如果您需要此功能,则应使用本机查询或提出其他解决方案。作为旁注:使用ORDER BY RAND()进行排序从1000行开始是非常缓慢的。

http://docs.doctrine-project.org/en/2.1/reference/faq.html#can-i-sort-by-a-function-for-example-order-by-rand-in-dql