2013-07-16 9 views
13

मैं लॉग इन किए गए उपयोगकर्ता के आधार पर संग्रह प्रकार में डेटा के साथ एक फॉर्म बनाने की कोशिश कर रहा हूं। मैं this chapter of the Symfony cookbook का अनुसरण कर रहा हूं।सिम्फनी फॉर्म query_buider और इकाई भंडार

सब कुछ ठीक काम करता है जब query_builder विकल्प एक बंद है जहां मुझे अपना डेटा डीक्यूएल से मिलता है। चूंकि कोड को कोड में अलग-अलग स्थान से लाने की आवश्यकता है, इसलिए मैं रिपोजिटरी कक्षा में क्वेरी को परिभाषित करना पसंद करूंगा।

public function findOwnedBy($user) { 
    $query = $this->getEntityManager()->createQuery("SELECT l FROM MyBundle:Article a JOIN a.owndBy u WHERE u.id = :userId"); 
    $query->setParameters(array("userId"=>$user->getId())); 
    return $query->getResult(); 
} 

इस समारोह काम करता है जब एक नियंत्रक में कहा जाता है और अनुच्छेद की एक सरणी वापसी:

यहाँ मेरी भंडार में कार्य है। यहाँ सिम्फोनी दस्तावेज़ का एक टुकड़ा है:

$formOptions = array(
        'class' => 'Acme\DemoBundle\Entity\User', 
        'multiple' => false, 
        'expanded' => false, 
        'property' => 'fullName', 
        'query_builder' => function(EntityRepository $er) use ($user) { 
         // build a custom query, or call a method on your repository (even better!) 
        }, 
       ); 

जब मैं query_builder में मेरी भंडार फ़ंक्शन की कॉल शब्दों में कहें, मैं एक त्रुटि मिलती है: Expected argument of type "Doctrine\ORM\QueryBuilder", "array" given, जो मैं समझ सकता हूँ क्योंकि मेरे भंडार इकाई की एक सरणी देता है, नहीं एक प्रश्नोत्तरी

मैं कोड को डुप्लिकेट नहीं करना चाहता हूं और फॉर्म में एक नया क्वेरीबिल्डर बनाना चाहता हूं। रिपोजिटरी से क्वेरी का उपयोग करने का सबसे अच्छा अभ्यास क्या है? मैं रिपोजिटरी में दो फ़ंक्शन रखने के बारे में सोच रहा था, एक एक सरणी लौट रहा था और दूसरा क्वेरीबिल्डर लौट रहा था, लेकिन सिम्फनी डॉक्टर "में टिप्पणी या अपनी रिपोजिटरी (यहां तक ​​कि बेहतर!) पर एक विधि कॉल करें" मुझे लगता है कि बेहतर तरीका है इस मामले के लिए।

उत्तर

24

यह आसान होना चाहिए।

public function queryOwnedBy($user) { 

    $query = $this->createQueryBuilder('a') 
      ->from('MyBundle:Article', 'a') 
      ->innerJoin('a.owndBy', 'u') 
      ->where('u.id = :id')     
      ->setParameter('id', $user->getId()); 

    return $query; 
} 

public function findOwnedBy($user) { 
    return $this->queryOwnedBy($user) 
      ->getQuery() 
      ->getResult(); 
} 
तब प्रपत्र बिल्डर में

: निम्न कार्य करें

$formOptions = array(
    'class' => 'Acme\DemoBundle\Entity\User', 
    'multiple' => false, 
    'expanded' => false, 
    'property' => 'fullName', 
    'query_builder' => function(EntityRepository $er) use ($user) { 
     return $er->queryOwnedBy($user); 
    }, 
); 

संपादित

धन्यवाद के ncatnow और Unagi के लिए मैं पिछले कार्यों बदल दिया है querybuilder

+0

मुझे यह भी आसान होना चाहिए और यह मेरी पहली कोशिश थी। यह मुझे त्रुटि 'प्रकार की अपेक्षित तर्क "सिद्धांत \ ORM \ Querybuilder", "सरणी" दिया गया है। मान लें कि 'query_builder' एक QueryBuilder ऑब्जेक्ट की अपेक्षा करता है, जो भी इसे सीधे दिया जाता है या बंद होने से लौटाया जाता है। – Florent

+0

पोस्ट संपादित किया गया। दो फ़ंक्शन बनाएं, जिस पर क्वेरी लौटाती है और दूसरा परिणाम देता है। फॉर्म बिल्डर पर वह फ़ंक्शन कॉल करता है जो क्वेरी देता है। यह काम करना चाहिए और अभी भी DRY है। क्षमा करें, मैं नाम बदल दूंगा क्योंकि वे उचित नहीं हैं। – saamorim

+0

हे, यह वास्तव में मैंने किया है और प्रश्न के अंतिम अनुच्छेद में जो वर्णन करता हूं। मैं इस तरह से जाऊंगा, सिम्फनी के डॉक्टर में छोटी टिप्पणी यह ​​सोचने देगी कि यह बॉक्स से बाहर काम कर सकती है, यह उलझन में है;) – Florent

8
वापस जाने के लिए

मैंने अभी सैमोरिम उत्तर का थोड़ा फिक्स किया है। कामकाजी कोड ऐसा कुछ होगा:

public function queryOwnedBy($user) { 

    $query = $this->createQueryBuilder("u") 
      ->where('u.id = :id')     
      ->setParameter('id', $user->getId()); 

    return $query; 
} 

public function findOwnedBy($user) { 
    return $this->queryOwnedBy($user) 
      ->getQuery() 
      ->getResult(); 
} 
+0

धन्यवाद। मैंने आपके उत्तर में अपना उत्तर एकीकृत कर लिया है और उदाहरण के अनुसार क्वेरी को बदल दिया है। – saamorim

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