2011-06-05 21 views
7

अब तक मेरे पास है:Doctrine2 querybuilder के माध्यम से यादृच्छिक पंक्ति कैसे प्राप्त करें?

$qb1 = $this->getEntityManager()->createQueryBuilder(); 
      $qb1->select('s') 
       ->from('\My\Entity\Song', 's') 
       ->where('s.id <> ?1') 
       ->orderBy('RAND()', '') 
       ->setMaxResults(1) 
       ->setParameters(array(1=>$current->id)); 

लेकिन उस doctrine2 नहीं समझती:

Error: Expected end of string, got '(' 

भी नहीं उनके querybuilder पेज इस पर कुछ भी नहीं है। क्या आप मुझे बताना चाहते हैं कि PHP के लिए सबसे अच्छा ORM में यादृच्छिक कार्य नहीं है?

+1

[यहां] (http://www.doctrine-project.org/documentation/manual/1_2/hu/dql-doctrine-query-language:order-by-clause:using-random-order) और [यहां] (http://www.onepie.org/2009/12/21/fetch-a-random-record-with-doctrine/) सिद्धांत 1.2 में दो उदाहरण हैं। मुझे लगता है कि कुछ ऐसा ही सिद्धांत के लिए काम करेगा 2. –

उत्तर

10

ऑर्डरबी विधि को सॉर्टिंग उद्देश्यों (जैसे 's.author' या 's.title') के लिए सॉन्ग के क्षेत्र को स्वीकार करना चाहिए, और यादृच्छिक मान नहीं। यहां तक ​​कि अगर आपने ऑर्डर करने के लिए यादृच्छिक फ़ील्ड चुना है, जैसे कि php में यादृच्छिक रूप से चयन करना, यह बिल्कुल यादृच्छिक नहीं होगा, क्योंकि आप हमेशा मौजूदा प्रकार के मानदंडों के लिए पहला परिणाम प्राप्त करने जा रहे हैं। यदि आपके गीतों में 8 फ़ील्ड हैं, तो आपको अपने खोज परिणामों में केवल 8 अलग-अलग गाने मिलेंगे, भले ही आपके पास हजारों संग्रहीत हों।

$qb1->select('s') 
    ->from('\My\Entity\Song', 's') 
    ->where('s.id <> ?1') 
    ->setMaxResults(1) 
    ->setParameters(array(1=>$current->id)) 
    ->setFirstResult($offset); 

यहाँ, एक यादृच्छिक मूल्य आप() या mt_rand() फ़ंक्शन रैंड के माध्यम से php में प्राप्त किया जा सकता है ऑफसेट $:

यहाँ एक सुझाव है। बेशक, $ ऑफसेट गाने की कुल संख्या से छोटा होना चाहिए। यह सिर्फ एक सुझाव है, आप इसे पूरा करने के कई तरीके हैं।

आईएमएचओ मुझे लगता है कि डॉक्टर 2 एक असाधारण ओआरएम है, और ऐसा कुछ भी उन्नत नहीं है। मुझे लगता है कि आप संदर्भ मार्गदर्शिका के Query Builder अनुभाग को पढ़ते हैं, लेकिन मैं यह भी सुझाव देता हूं कि आप DQL अनुभाग पढ़ें, जो बताता है कि सिद्धांत क्वेरी सिस्टम के भीतर उपलब्ध फ़ंक्शंस क्या हैं और आप अपना स्वयं का (कैसे) बना सकते हैं।

+0

तो असाधारण आप रैंड() द्वारा ऑर्डर नहीं कर सकते हैं। – darkbluesun

3

आपको कस्टम डीक्यूएल फ़ंक्शन रैंड जोड़ने की आवश्यकता है। composer.json में

doctrine: 
    orm: 
     entity_managers: 
      default: 
       dql: 
        numeric_functions: 
         rand: DoctrineExtensions\Query\Mysql\Rand 

और आप के लिए जोड़ निर्भरता: symfony2 ढांचे के लिए आप बस config में जोड़ सकते हैं

composer require beberlei/DoctrineExtensions

फिर, 100 यादृच्छिक AcmeBundle:Item संस्थाओं प्राप्त करने के लिए समाधान के रूप में आसान होगा के रूप में:

$em = $this->getContainer()->get('doctrine')->getManager(); 
$messages = $em->createQueryBuilder() 
    ->select('i, RAND() AS HIDDEN r') 
    ->from('AcmeBundle:Item', 'i') 
    ->orderBy('r', 'ASC') 
    ->setMaxResults(100) 
    ->getQuery() 
    ->getResult(); 

नोट: इस मानता है कि आपके MySQL ओ का उपयोग कर रहे हैं मारिया डीबी बैकएंड। SQLite या PostGreSQL के लिए आपको एक भिन्न कार्यान्वयन कक्षा की आवश्यकता हो सकती है।

+1

यह निश्चित रूप से सही जवाब होना चाहिए –

संबंधित मुद्दे