2011-11-30 12 views
48

क्या मैं आलसी लोडिंग का उपयोग करते समय सिद्धांत 2 में एक सरणी चयन से परिणाम फ़िल्टर कर सकता हूं? उदाहरण के लिए,सिद्धांत 2 ArrayCollection फ़िल्टर विधि

// users = ArrayCollection with User entities containing an "active" property 
$customer->users->filter('active' => TRUE)->first() 

यह मेरे लिए अस्पष्ट है कि वास्तव में फ़िल्टर विधि का उपयोग कैसे किया जाता है।

+0

लेकिन अभी भी कई डेटा के लिए विधि लोड है, उदाहरण के लिए गिनती के लिए, सभी मिलान डेटा लोड करें। –

उत्तर

66

बोरिस Guéry जवाब के इस पोस्ट पर, आप मदद कर सकते हैं: Doctrine 2, query inside entities

$idsToFilter = array(1,2,3,4); 

$member->getComments()->filter(
    function($entry) use ($idsToFilter) { 
     return in_array($entry->getId(), $idsToFilter); 
    } 
); 
+4

फ़िल्टर विधि का उपयोग करने में एकमात्र समस्या यह है कि आपको इसे फ़िल्टर करने से पहले सभी डेटा लाने होंगे, क्या आपको पता है कि सबकुछ लाने के बिना ऐसा करने का कोई तरीका है या नहीं? – Dennis

+0

हाय - मैं उपर्युक्त कोशिश कर रहा हूं लेकिन एक वाक्यविन्यास त्रुटि प्राप्त कर रहा हूं, क्या आप अपना उत्तर अपडेट कर सकते हैं? – Sjwdavies

+0

@Sjwdavies मैंने इसे आपके लिए अपडेट किया। गुम() लगभग $ idsToFilter। – Jrgns

12

आपका उपयोग मामला होगा:

$ArrayCollectionOfActiveUsers = $customer->users->filter(function($user) { 
         return $user->getActive() === TRUE; 
        }); 

अगर आप जोड़ना -> पहले() आप मिल जाएगा केवल पहली प्रविष्टि लौटी, जो आप नहीं चाहते हैं।

@ Sjwdavies आपको उस यूजर को पास करने की आवश्यकता है जिसे आप यूएसई पास करते हैं। तुम भी in_array वापसी एक बूलियन पहले से ही के रूप में छोटा कर सकते हैं:

$member->getComments()->filter(function($entry) use ($idsToFilter) { 
     return in_array($entry->getId(), $idsToFilter); 
    }); 
-1

Collection#filter विधि वास्तव में उत्सुक लोड सभी सदस्यों करता है। एसक्यूएल स्तर पर फ़िल्टरिंग सिद्धांत 2.3 में जोड़ा जाएगा।

+1

क्या यह सच है कि 2.3 बाहर है? मुझे इसे दस्तावेज़ों में नहीं मिला है। क्या हम फ़िल्टर और अन्य चीजों की तरह सामान कर सकते हैं, यह उम्मीद करते हुए कि संग्रह क्वेरी पर फ़िल्टरिंग लागू करेगा और क्वेरी को स्थगित करेगा? – Pinetree

+0

@Pinetree कम से कम वे ऐसा कहते हैं: http://docs.doctrine-project.org/en/latest/reference/working-with-associations.html#filtering-collections – Robin

101

सिद्धांत अब Criteria है जो संदर्भ के आधार पर SQL और PHP में संग्रह फ़िल्टर करने के लिए एक एकल API प्रदान करता है।

http://docs.doctrine-project.org/en/latest/reference/working-with-associations.html#filtering-collections

अद्यतन

इस डेटाबेस से सब कुछ प्राप्त किए बिना, स्वीकार किए जाते हैं जवाब में परिणाम प्राप्त करेंगे।

use Doctrine\Common\Collections\Criteria; 

/** 
* @ORM\Entity 
*/ 
class Member { 
    // ... 
    public function getCommentsFiltered($ids) { 
    $criteria = Criteria::create()->where(Criteria::expr()->in("id", $ids)); 

    return $this->getComments()->matching($criteria); 
    } 
} 
+0

यह साफ़ करने के लिए धन्यवाद वास्तव में एसक्यूएल क्वेरी को बदल देगा , डेटाबेस से सब कुछ चुनने के बजाय और फिर एक चक्र के माध्यम से एक फिल्टर लागू करने के बजाय! – tftd

+0

http: // stackoverflow।कॉम/प्रश्न/35358597/इन-प्रीपेक्ट-साथ-मानदंड-फ़िल्टरिंग-काम नहीं कर रहा है, कृपया यहां एक नज़र डालें :) – DonCallisto

+0

संग्रह पर 'indexBy = "xxx" 'का उपयोग करते समय और मिलान करने पर एक समस्या दिखाई देती है 'उस पर, जहां इंडेक्स को त्याग दिया जाता है। https://github.com/doctrine/doctrine2/issues/4693 – fyrye

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