2013-05-18 7 views
5

से यादृच्छिक उत्पाद मिल मैं निम्नलिखित डेटाबेस योजना है:Symfony2 सिद्धांत एक वर्ग

table 'products' 
id 
category_id 

और निश्चित रूप से एक वर्ग तालिका, बस एक आईडी के साथ।

डेटा है कि कुछ इस तरह दिखाई:

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 रिश्ता है, इसलिए मैं भी 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'); 
संबंधित मुद्दे