在Symfony2中选择随机数据库条目-出现错误


Selecting random DB entry in Symfony2 - Getting an error

我一直在尝试拉出一个随机行,我使用了这个:

这是我发现的没有真正帮助的示例代码(我在这里发现:https://gist.github.com/pierroweb/1518601)

class QuestionRepository extends EntityRepository
{
    public function findOneRandom()
    {
        $em = $this->getEntityManager();
        $max = $em->createQuery('
            SELECT MAX(q.id) FROM EnzimQuestionBundle:Question q
            ')
            ->getSingleScalarResult();
        return $em->createQuery('
            SELECT q FROM EnzimQuestionBundle:Question q 
            WHERE q.id >= :rand
            ORDER BY q.id ASC
            ')
            ->setParameter('rand',rand(0,$max))
            ->setMaxResults(1)
            ->getSingleResult();
    }
}

现在我有这样的东西:

    $em = $this->getEntityManager();
    $max = $em->createQuery('SELECT MAX(p.id) FROM GreenMonkeyDevGlassShopBundle:Product p')->getSingleScalarResult();
    return $em->createQuery('SELECT p FROM GreenMonkeyDevGlassShopBundle:Product p INNER JOIN (SELECT p2.categories. FROM GreenMonkeyDevGlassShopBundle:Product p.categories WHERE :cid IN(pc) p.id >= :rand ORDER BY p.id ASC')
        ->setParameter('cid', $category_id)
        ->setParameter('rand',rand(0,$max))
        ->setMaxResults(intval($limit))
        ->getSingleResult();

不过,我一直收到这样的错误:FatalErrorException: Error: Call to undefined method Doctrine'ORM'Query'ResultSetMapping::addRootEntityFromClassMetadata() in /var/www/gmd-milkywayglass/src/GreenMonkeyDev/GlassShopBundle/Entity/CategoryRepository.php line 42

你认为我做错了什么吗?我知道条令没有随机的方法。也许有一些简单的解决方案?非常感谢。

您应该尝试编写自己的DQL函数,以便在查询中使用RAND():

namespace My'Custom'Doctrine2'Function;
/**
 * RandFunction ::= "RAND" "(" ")"
 */
class Rand extends FunctionNode
{
    public function parse('Doctrine'ORM'Query'Parser $parser)
    {
        $parser->match(Lexer::T_IDENTIFIER);
        $parser->match(Lexer::T_OPEN_PARENTHESIS);
        $parser->match(Lexer::T_CLOSE_PARENTHESIS);
    }
    public function getSql('Doctrine'ORM'Query'SqlWalker $sqlWalker)
    {
        return 'RAND()';
    }
}

在您必须在symfony2 config.yml 中注册此DQL函数之后

doctrine:
    dbal:
        # ...
    orm:
        #...
        dql:
            numeric_functions:
                RAND: My'Custom'Doctrine2'Function

有关更多信息,请阅读以下链接

DQL用户定义函数

如何在Symfony2 中注册自定义DQL函数