如何通过Doctrine2 querybuilder获取随机行?

Tjo*_*rie 7 symfony doctrine-orm

到目前为止,我有:

$qb1 = $this->getEntityManager()->createQueryBuilder();
            $qb1->select('s')
                ->from('\My\Entity\Song', 's')
                ->where('s.id <> ?1')
                ->orderBy('RAND()', '')
                ->setMaxResults(1)
                ->setParameters(array(1=>$current->id));
Run Code Online (Sandbox Code Playgroud)

但是,教义2并不理解:

Error: Expected end of string, got '('
Run Code Online (Sandbox Code Playgroud)

甚至他们的querybuilder页面上都没有任何内容.你想告诉我php最好的ORM没有随机功能吗?

fak*_*ken 11

orderBy方法应该接受Song的字段用于排序目的(例如's.author'或's.title'),而不是随机值.即使你选择了一个随机字段进行排序,比如在php中随机选择一个,这根本不是随机的,因为你总是会得到当前排序标准的第一个结果.如果您的歌曲有8个字段,那么即使您有数千个存储,您的搜索结果中也只能获得8首不同的歌曲.

这是一个建议:

$qb1->select('s')
    ->from('\My\Entity\Song', 's')
    ->where('s.id <> ?1')
    ->setMaxResults(1)
    ->setParameters(array(1=>$current->id))
    ->setFirstResult($offset);
Run Code Online (Sandbox Code Playgroud)

这里,$ offset可以是你通过rand()或mt_rand()函数在php中获得的随机值.当然,$ offset应该小于歌曲的总数.这只是一个建议,有很多方法可以实现这一目标.

恕我直言,我认为Doctrine2是一个非凡的ORM,并没有像它那样先进的东西.我假设你阅读了参考指南的查询生成器部分,但我也建议你阅读DQL部分,它解释了Doctrine查询系统中可用的功能是什么,以及如何创建自己的(!).