2013-05-18 14 views
5

からランダム製品を得ます。Symfony2の教義は、私は次のデータベーススキーマを持っているカテゴリ

Products 
-------------------- 
| id | category_id | 
-------------------- 
| 0 | 1   | 
| 1 | 1   | 
| 2 | 1   | 
| 3 | 2   | 
| 4 | 2   | 
| 5 | 1   | 
-------------------- 

は、私が(例えば、カテゴリ1の場合)カテゴリを選択したいと思いますので、私は私の製品のリポジトリクラスでそのカテゴリからすべての行を選択します:

データはそのような何かを見て

return $this 
    ->createQueryBuilder('u') 
    ->andWhere('u.category = :category') 
    ->setMaxResults(1) 
    ->setParameter('category', $category->getId()) 
    ->getQuery() 
    ->getSingleResult() 
; 

どのようにランダムな製品を選択できますか?また、関係を介してこれを解決することは可能ですか?

)私は実体「カテゴリー」と「製品」の間にOneToManyの関係を持っているので、私も(category-> getProducts経由ですべての製品を得ることができる...

すべてのヘルプは本当に便利になり、おかげで

答えて

12

まず、製品の総数を数え、次にランダムな製品を選択するためにランダムオフセットを生成する必要があります。

$count = $this->createQueryBuilder('u') 
      ->select('COUNT(u)') 
      ->getQuery() 
      ->getSingleScalarResult(); 

そして、あなたはあなたの1行の合計数との間の乱数を生成することができます

は、これはあなたが始める必要があります。

に変換
return $this->createQueryBuilder('u') 
    ->where('u.category = :category') 
    ->setFirstResult(rand(0, $count - 1)) 
    ->setMaxResults(1) 
    ->setParameter('category', $category->getId()) 
    ->getQuery() 
    ->getSingleResult() 
; 

SELECT * FROM products WHERE category_id = ? LIMIT 1, {random offset} 
+0

は 'カウントクエリにgetResult''べきではありませんgetSingleScalarResult'? – Machiel

+0

私はこのスニペットが私が答えたときに働いたことを知っていますが、私はしばらくのうちにドクトリンに触れていないので、物事が変わったかもしれません。 –

+1

ここでは、すぐに使える機能があります:https://gist.github.com/Thinkscape/124d658e4076421c0516 –

0

使用このヘルパー関数:

<?php 
use Doctrine\ORM\EntityManager; 

/** 
* Retrieve one random item of given class from ORM repository. 
* 
* @param EntityManager $em The Entity Manager instance to use 
* @param string  $class The class name to retrieve items from 
* @return object 
*/ 
function getRandomDoctrineItem(EntityManager $em, $class) 
{ 
    static $counters = []; 
    if (!isset($counters[$class])) { 
     $this->counters[$class] = (int) $this->manager->createQuery(
      'SELECT COUNT(c) FROM '. $class .' c' 
     )->getSingleScalarResult(); 
    } 
    return $em 
     ->createQuery('SELECT c FROM ' . $class .' c ORDER BY c.id ASC') 
     ->setMaxResults(1) 
     ->setFirstResult(mt_rand(0, $counters[$class] - 1)) 
     ->getSingleResult() 
    ; 
} 

使用例:

$randomItem = getRandomDoctrineItem($em, 'Application\Entity\Post'); 
関連する問題