2017-02-17 37 views
-1

dqlクエリでランダムな結果を得るにはどうすればよいですか?Symfony doctrine MaxResultを使用したクエリのDQLランダム結果

これが私のクエリです:

$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

look [here](http://stackoverflow.com/questions/10762538/how-to-select-randomly-with-doctrine)、これはすでに回答済みです – iscato

+0

[Doctrineでランダムに選択する方法]の可能な複製(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(); 
関連する問題