Doctrine के साथ कई स्तंभों द्वारा आदेश


115

मुझे दो कॉलमों द्वारा डेटा ऑर्डर करने की आवश्यकता है (जब पंक्तियों में कॉलम नंबर 1 के लिए अलग-अलग मान हैं, इसके द्वारा ऑर्डर करें; अन्यथा, कॉलम नंबर द्वारा ऑर्डर करें)

मैं QueryBuilderक्वेरी बनाने के लिए a का उपयोग कर रहा हूं ।

यदि मैं orderByदूसरी बार विधि को कॉल करता हूं , तो यह किसी भी पूर्व निर्दिष्ट आदेश को बदल देता है।

मैं पहले पैरामीटर के रूप में दो कॉलम पास कर सकता हूं:

->orderBy('r.firstColumn, r.secondColumn', 'DESC');

लेकिन मैं दूसरे पैरामीटर के लिए दो आदेश दिशाओं को पारित नहीं कर सकता, इसलिए जब मैं इस क्वेरी को निष्पादित करता हूं तो पहला कॉलम एक आरोही दिशा में और दूसरा एक, अवरोही क्रम में आदेश दिया जाता है। मैं उन दोनों के लिए अवरोही का उपयोग करना चाहूंगा।

क्या इसका उपयोग करने का कोई तरीका है QueryBuilder? क्या मुझे DQL का उपयोग करने की आवश्यकता है?

जवाबों:


213

आपको कॉलम नाम के ठीक बाद ऑर्डर दिशा जोड़ना होगा:

$qb->orderBy('column1 ASC, column2 DESC');

जैसा कि आपने नोट किया है, कई कॉल orderBy स्टैक नहीं करते हैं , लेकिन आप कई कॉल कर सकते हैं addOrderBy:

$qb->addOrderBy('column1', 'ASC')
   ->addOrderBy('column2', 'DESC');

2
धन्यवाद। मैं पहले यह नोटिस नहीं किया था। मैंने सोचा कि इसके लिए दो ऑर्डर स्टेटमेंट ठीक हैं। तो मैं addOrderBy विधि का एहसास नहीं था। इसे इंगित करने के लिए चीयर्स :)

डिएगो अगुलो: दुर्भाग्य से आपके उत्तर के दोनों लिंक अब काम नहीं कर रहे हैं।
k00ni

1
@ k00ni इसे इंगित करने के लिए धन्यवाद। मैंने पूर्व को नवीनतम डॉक्स में अपडेट किया था, लेकिन मैं गीथहब पर माइग्रेटेड समस्या DC-909 नहीं खोज सका, इसलिए मैंने बाद को हटा दिया।
डिएगो अगुलो

तालिका उपनाम के साथ क्वेरी बिल्डरों के लिए, जोड़ना न भूलें alias.column_name
मौलिक परमार

16

Doctrine 2.x में आप उपर्युक्त उदाहरणों से doctrine 'orderBy' या 'addOrderBy' का उपयोग करके कई आदेश पारित नहीं कर सकते। क्योंकि, यह स्वचालित रूप से अंतिम कॉलम नाम के अंत में 'ASC' जोड़ता है, जब आपने दूसरे पैरामीटर को खाली छोड़ दिया, जैसे कि 'ऑर्डरबाय' फ़ंक्शन।

उदाहरण के लिए ->orderBy('a.fist_name ASC, a.last_name ASC')SQL को कुछ इस तरह से आउटपुट करेगा 'ORDER BY first_name ASC, last_name ASC ASC'। तो यह SQL सिंटैक्स त्रुटि है। केवल इसलिए कि डिबेट या ऐडऑर्डरबाय का डिफॉल्ट 'एएससी' है।

आपके द्वारा कई ऑर्डर जोड़ने के लिए 'ऐड' फ़ंक्शन का उपयोग करने की आवश्यकता है। और यह इस तरह होगा।

->add('orderBy','first_name ASC, last_name ASC')। यह आपको सही ढंग से स्वरूपित SQL देगा।

ऐड () फ़ंक्शन पर अधिक जानकारी। https://www.doctrine-project.org/projects/doctrine-orm/en/2.6/reference/query-builder.html#low-level-api

उम्मीद है की यह मदद करेगा। चीयर्स!


8

आप उपयोग कर सकते हैं ->addOrderBy($sort, $order)

जोड़ें: Doctrine Querybuilder btw। अक्सर सामान्य तरीकों में से "विशेष" संशोधनों का उपयोग करता है, को देखने के select-addSelect, where-andWhere-orWhere, groupBy-addgroupBy...


0

orderByस्रोत कोड नोटों के लिए टिप्पणी Keys are field and values are the order, being either ASC or DESC.:। तो आप कर सकते हैं orderBy->(['field' => Criteria::ASC])


यह सही नहीं है। मेरा जवाब ऊपर देखें
थॉमस हैनसन

0

orderByविधि या तो दो तार या एक आवश्यकता है Expr\OrderByवस्तु। यदि आप कई आदेश घोषणाओं को जोड़ना चाहते हैं, तो सही बात यह है कि addOrderByविधि का उपयोग किया जाए , या किसी OrderByवस्तु को पलटाया जाए और उसके अनुसार उसे पॉप्युलेट किया जाए:

   # Inside a Repository method:
   $myResults = $this->createQueryBuilder('a')
       ->addOrderBy('a.column1', 'ASC')
       ->addOrderBy('a.column2', 'ASC')
       ->addOrderBy('a.column3', 'DESC')
   ;

   # Or, using a OrderBy object:
   $orderBy = new OrderBy('a.column1', 'ASC');
   $orderBy->add('a.column2', 'ASC');
   $orderBy->add('a.column3', 'DESC');

   $myResults = $this->createQueryBuilder('a')
       ->orderBy($orderBy)
   ;
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.