2013-07-04 1 views
0

Я пытался вытащить случайную строку, я использовал это:Выбор случайной записи БД в Symfony2 - Получение ошибки

Это пример кода, я обнаружил, что не было на самом деле помочь (я нашел здесь: 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

Любые мысли о том, что я могу делать неправильно? Я знаю, что у Доктрины нет случайного метода. Может быть, есть какое-то простое решение? Спасибо!

ответ

1

Вы должны попытаться написать свою собственную функцию 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()'; 
    } 
} 

После того, как зарегистрировать эту функцию DQL в Symfony2 config.yml

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

Для получения дополнительной информации, прочтите следующие ссылки

DQL User Defined Functions

How to Register Custom DQL Functions in Symfony2

+0

Действительно надеясь, что мне не придется это делать. Спасибо! – TooTiredToDrink