2013-01-24 42 views
21

के मैं दो संस्थाओं उपयोगकर्ता और सिद्धांत के साथ एक बहुत-से-अनेक संबंध से संबंधित उत्पाद लगता करते हैं।उचित तरीके से जांच करने के लिए - Symfony2/सिद्धांत

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

मैं वर्तमान में इस कर रहा हूँ:

public function hasProduct($id) 
{ 
    foreach($this->getProducts() as $product) { 
     if($product->getId() == $id) { 
      return true; 
     } 
    } 

    return false; 
} 

लेकिन मुझे यकीन है कि यह सबसे अच्छा तरीका है, खासकर अगर पाश में कई संबंधों है वहाँ नहीं कर रहा हूँ।

किसी ने कुछ बेहतर है, तो मुझे पता है :)

उत्तर

49

आपका समारोह getProducts आप एक ArrayCollection देता हैं।

बस कर

if($user->getProducts()->contains($product)) //the real product object not the id 
     //your stuff 

संपादित करें:

टहनी टेम्पलेट के लिए:

{% if product in user.products %} 
    //your stuff 
{% endif %} 
+0

अच्छा लगता है! मैं इसका इस्तेमाल करूंगा। क्या twig टेम्पलेट्स में इसे करने का कोई तरीका है? –

+0

और क्या अगर मैं जैसे जाँच करना चाहते हैं यदि किसी दिए गए नाम से उत्पाद निकलता है? – Abdel5

+0

आपको उत्पादों के माध्यम से मैन्युअल रूप से लूप करना होगा या कस्टम 'DQL' क्वेरी – Pierrickouw

0

मैं एक ही समस्या के साथ संघर्ष कर रहा था, और this ब्लॉग प्रविष्टि जो इस समस्या का समाधान में आए सिद्धांत फ़िल्टर का उपयोग करके।

अगर मैं सही ढंग से अपनी समस्या को समझते हैं और आप तीन तालिकाओं (उपयोगकर्ता, user_product और उत्पाद) आप इस तरह अपने hasProduct ($ आईडी) समारोह को फिर से लिखने में सक्षम होना चाहिए है:

use Doctrine\Common\Collections\Criteria; 

public function hasProduct(int $productId): bool { 

    $criteria = Criteria::create(); 
    $criteria->where(Criteria::expr()->eq('id', $productId)); 

    if(count($this->products->matching($criteria)) > 0) { 
    return true; 
    } 

    return false; 
} 

इस कोड को चलाते समय, सिद्धांत उपयोगकर्ता से जुड़े सभी उत्पादों को लोड नहीं करता है। यह वास्तव में केवल क्रॉस संदर्भ तालिका (user_product) प्रश्नों।