2011-09-02 5 views
11

जब मैं किसी क्वेरी पर setMaxResults को कॉल करता हूं, तो ऐसा लगता है कि अधिकतम संख्या को "2" के रूप में देखना है, इससे कोई फर्क नहीं पड़ता कि यह वास्तविक मूल्य क्या है।

function findMostRecentByOwnerUser(\Entities\User $user, $limit) 
{ 
    echo "2: $limit<br>"; 
    $query = $this->getEntityManager()->createQuery(' 
     SELECT t 
     FROM Entities\Thread t 
     JOIN t.messages m 
     JOIN t.group g 
     WHERE 
      g.ownerUser = :owner_user 
     ORDER BY m.timestamp DESC 
    '); 
    $query->setParameter("owner_user", $user); 
    $query->setMaxResults(4); 
    echo $query->getSQL()."<br>"; 
    $results = $query->getResult(); 
    echo "3: ".count($results); 
    return $results; 
} 

जब मैं बाहर टिप्पणी setMaxResults लाइन, मैं 6 परिणाम प्राप्त। जब मैं इसे छोड़ देता हूं, तो मुझे 2 सबसे हालिया परिणाम मिलते हैं। जब मैं phpMyAdmin में जेनरेट किए गए SQL कोड चलाता हूं, तो मुझे 4 सबसे हाल के परिणाम मिलते हैं। उत्पन्न एसक्यूएल, संदर्भ के लिए, यह है:

SELECT <lots of columns, all from t0_> 
FROM Thread t0_ 
INNER JOIN Message m1_ ON t0_.id = m1_.thread_id 
INNER JOIN Groups g2_ ON t0_.group_id = g2_.id 
WHERE g2_.ownerUser_id = ? 
ORDER BY m1_.timestamp DESC 
LIMIT 4 

संपादित:

the DQL "Limit" documentation पढ़ते समय, मैं भर में आया था निम्नलिखित: आपकी क्वेरी एक fetch- शामिल

हैं परिणाम सीमा निर्धारित करने के तरीके में शामिल होने वाले संग्रह में काम नहीं कर रहे हैं जैसा आप उम्मीद करेंगे। मैक्स परिणाम सेट करें डेटाबेस परिणाम पंक्तियों की संख्या को प्रतिबंधित करता है, हालांकि fetch-join संग्रहों के मामले में एक रूट इकाई कई पंक्तियों में दिखाई दे सकती है, जो परिणामों की निर्दिष्ट संख्या से प्रभावी रूप से हाइड्रेटिंग कर सकती है।

मुझे पूरा यकीन है कि मैं एक fetch-join संग्रह नहीं कर रहा हूं। मैं इस धारणा के तहत हूं कि एक fetch-join संग्रह है जहां मैं SELECT t, m FROM Threads JOIN t.messages जैसा कुछ करता हूं। क्या मैं इसकी समझ में गलत हूं?

+0

मैंने अभी तक सिद्धांत 2.2 के साथ एक ही समस्या देखी है। मुझे आश्चर्य है कि इसके लिए कोई कामकाज नहीं है ... – Gregoire

उत्तर

10

एक अद्यतन: सिद्धांत के साथ आप paginator http://docs.doctrine-project.org/en/latest/tutorials/pagination.html

+1

किसी भी तरह से मैं इसे काम करने के लिए कभी नहीं मिला (इसे पहले याद कर रहा हूं लेकिन अब इसे काम नहीं कर सका)। पिछले सप्ताह डाउनलोड सिम्फनी और /var/www/html/Symfony/vendor/doctrine/common/lib/Doctrine/Common/Version.php मुझे यह संस्करण 2.3.0 बताता है कि कई लिंक के साथ आपके लिंक से कोड को चलाने से मुझे कई संबंध मिलते हैं 2143 का एक गिनती ($ पेजिनेटर) इससे कोई फर्क नहीं पड़ता कि मैं सेटमैक्स रिजल्ट का क्या उपयोग करता हूं। – HMR

1

मैंने मास्टर टेबल की सामग्री लाने और fetch="EAGER" के रूप में प्राप्त सभी तालिकाएं प्राप्त करने के साथ ही एक ही समस्या हल की, जिसे इकाई में परिभाषित किया गया है (यहां http://www.doctrine-project.org/docs/orm/2.1/en/reference/annotations-reference.html?highlight=eager#manytoone वर्णित)।

class VehicleRepository extends EntityRepository 
{ 
    /** 
    * @var integer 
    */ 
    protected $pageSize = 10; 

    public function page($number = 1) 
    { 
     return $this->_em->createQuery('SELECT v FROM Entities\VehicleManagement\Vehicles v') 
      ->setMaxResults(100) 
      ->setFirstResult($number - 1) 
      ->getResult(); 
    } 
} 

मेरे उदाहरण में रेपो आप देख सकते हैं कि मैंने केवल सही परिणाम राशि प्राप्त करने के लिए वाहन तालिका लाई है। लेकिन सभी गुण (जैसे बनाना, मॉडल, श्रेणी) तुरंत लाए जाते हैं।

class Vehicles 
{ 
    ... 

    /** 
    * @ManyToOne(targetEntity="Makes", fetch="EAGER") 
    * @var Makes 
    */ 
    public $make; 

    ... 
} 

:

(। मैं भी इकाई-सामग्री पर दोहराया क्योंकि मैं इकाई एक सरणी के रूप में प्रतिनिधित्व जरूरत है, लेकिन उस बात afaik नहीं करना चाहिए)

यहाँ मेरी इकाई से एक अंश है इसका महत्वपूर्ण है कि आप हर इकाई को सही तरीके से मानचित्र करते हैं अन्यथा यह काम नहीं करेगा।

5

का उपयोग ->groupBy('your_entity.id') इस मुद्दे को हल करने लगते हैं का उपयोग कर सकते 2.2+!

+0

मैंने अभी कोशिश की है। सबसे पहले यह काम करना प्रतीत होता था, लेकिन ऐसा लगता है कि यह परिणाम तालिका को लाने में परिणामों को सीमित कर रहा है। –