2017-02-17 47 views
-1

我怎樣才能得到一個隨機結果與dql查詢?Symfony原則DQL隨機結果查詢MaxResult

這是我的查詢:

$firstCategoryId = 50; 

$repository = $this->entityManager->getRepository(BaseProduct::class); 

     $products = $repository->createQueryBuilder('p') 
      ->join('p.categories', 'c') 
      ->where('c.id = :categoryId') 
      ->setParameter('categoryId', $firstCategoryId) 
      ->getQuery() 
      ->setMaxResults(4) 
      ->getResult(); 

這將返回我總是第4種產品。 可以說ID 50的產品有100多種產品。我想要的是隨機查詢ID爲50的類別中的4篇文章,但是如何?這可能嗎?當然,我不能設置最大結果,也不能使用PHP ...但是由於性能,這不是一個好的解決方案。

+0

如果你真的不關心速度,你可以嘗試把所有的產品,洗牌的結果數組,然後拿到前4種元素。 –

+0

看[這裏](http://stackoverflow.com/questions/10762538/how-to-select-randomly-with-doctrine),這已經回答 – iscato

+0

[如何隨機選擇教條](http: //stackoverflow.com/questions/10762538/how-to-select-randomly-with-doctrine) – Veve

回答

2

您需要爲此創建dql函數。 https://gist.github.com/Ocramius/919465你可以檢查。

namespace Acme\Bundle\DQL; 

use Doctrine\ORM\Query\Lexer; 
use Doctrine\ORM\Query\Parser; 
use Doctrine\ORM\Query\SqlWalker; 
use Doctrine\ORM\Query\AST\Functions\FunctionNode; 

class RandFunction extends FunctionNode 
{ 
    public function parse(Parser $parser) 
    { 
     $parser->match(Lexer::T_IDENTIFIER); 
     $parser->match(Lexer::T_OPEN_PARENTHESIS); 
     $parser->match(Lexer::T_CLOSE_PARENTHESIS); 
    } 

    public function getSql(SqlWalker $sqlWalker) 
    { 
     return 'RAND()'; 
    } 
} 

之後,打開你的config.yml文件並添加自動加載RandFunction。

orm: 
     dql: 
      numeric_functions: 
       Rand: Acme\Bundle\DQL\RandFunction 

,且查詢必須像:

$firstCategoryId = 50; 

$repository = $this->entityManager->getRepository(BaseProduct::class); 

     $products = $repository->createQueryBuilder('p') 
      ->join('p.categories', 'c') 
      ->addSelect('RAND() as HIDDEN rand') 
      ->where('c.id = :categoryId') 
      ->orderBy('rand') 
      ->setParameter('categoryId', $firstCategoryId) 
      ->getQuery() 
      ->setMaxResults(4) 
      ->getResult();