0

私はランダムな行を引き出そうとしていましたが、これを使用しました:

これは私が見つけたサンプルコードで、実際には役に立ちませんでした (ここで見つけました: 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

私が間違っている可能性があることについて何か考えはありますか?Doctrine には get random メソッドがないことを知っています。多分いくつかの簡単な解決策がありますか?ありがとうございました!

4

1 に答える 1

1

クエリで RAND() を使用するには、独自の DQL 関数を作成する必要があります。

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()';
    }
}

この DQL 関数を symfony2 config.yml に登録する必要がある後

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

詳細については、次のリンクを参照してください。

DQL ユーザー定義関数

Symfony2 でカスタム DQL 関数を登録する方法

于 2013-07-04T09:49:09.953 に答える