2012-02-03 15 views
7

प्रलेखन राज्यों:कई 1 के लिए शर्तों में शामिल होने के निर्दिष्ट करने के लिए कैसे: सिद्धांत में 1 संबंध 2

class Cart 
{ 
    // ... 

    /** 
    * @OneToOne(targetEntity="Customer", inversedBy="cart") 
    * @JoinColumn(name="customer_id", referencedColumnName="id") 
    */ 
    private $customer; 

    // ... 
} 

यह टिप्पणी ऐसे एसक्यूएल प्रतिनिधित्व करता है:

JOIN Customer c ON c.id = cart.customer_id 

और मुद्दा यह है कि मैं अतिरिक्त जोड़ने की जरूरत है तुलनात्मक रूप से, जैसे:

JOIN Customer c ON c.id = cart.customer_id AND c.anotherField = <constant> 

इसके लिए कोई समाधान?

युपीडी:

असली अतिरिक्त शर्त मैं अब के लिए की जरूरत है <const> BETWEEN c.f1 AND c.f2

+0

आप दूसरे के साथ स्तंभ में शामिल होने को निर्दिष्ट करने की कोशिश की है 'कॉलम परिभाषा =" enum ('YOUR_CONSTANT') ")'? – jkucharovic

+0

क्वेरी बनाते समय आप क्वेरीबिल्डर का उपयोग कर सकते हैं? – CappY

+0

वास्तव में, दूसरी स्थिति थोड़ा और मुश्किल है - मैंने सोचा कि यह * सामान्य * समाधान के लिए कोई फर्क नहीं पड़ता। अभी के लिए मुझे 'और की आवश्यकता है c.f1 और c.f2' – zerkms

उत्तर

0

है आप, अतिरिक्त शर्तें शामिल हो निर्दिष्ट करने के लिए WITH कीवर्ड का उपयोग के रूप में आप examples में से कुछ में देख सकते हैं कर सकते हैं।

मुझे लगता है कि यह आप के लिए जा रहा मिलना चाहिए:

SELECT l, c FROM location 
INNER JOIN Customer c 
WITH CURRENT_TIMESTAMP() BETWEEN c.f1 AND c.f2 
WHERE CURRENT_TIMESTAMP() BETWEEN l.f1 AND l.f2 

मैं ON खंड हटा दिया क्योंकि मैं स्पष्ट रूप से निर्दिष्ट करने के लिए कोई आवश्यकता नहीं है में शामिल होने के ON क्षेत्रों जब तक कि वे "मानक" लोगों (प्रत्येक की आईडी नहीं हैं लगता है इकाई)

भी CURRENT_TIMESTAMP() पर कॉल को नोटिस करता है जो MySQL के NOW() में अनुवाद करता है। अन्य सुंदर उपयोगी कुल कार्यों और एक्सप्रेशंस की एक सूची देखें here

+2

के बीच वास्तव में प्रश्न का उत्तर नहीं देता है। मान लें कि आप केवल सक्रिय रिकॉर्ड चाहते थे, क्या आप इसे नोटेशन के साथ व्यक्त कर सकते हैं? या कृपया एक इकाई की संपत्ति को पॉप्युलेट करने के लिए डीक्यूएल के उस ब्लॉब का उपयोग कैसे करें, इसकी व्याख्या करें। – ficuscr

0

आपकी समस्या का कोई समाधान नहीं लगता है कि सिद्धांत ऑटो-जादुई रूप से कर सकता है।

चूंकि @ficuscr ने आपको पहले से ही प्रश्नों का समाधान दिया है, इसलिए केवल एक और चीज हैडल करने के लिए - अपने अतिरिक्त मानदंडों की जांच करें और सफलतापूर्वक अपने प्राप्तकर्ता में ग्राहक उदाहरण वापस करें और अतिरिक्त मानदंडों को पूरा करने में विफलता पर न्यूल करें।

class Cart 
{ 
    const VALUE = '<some_constant_value>'; 
    /** 
    * @OneToOne(targetEntity="Customer", inversedBy="cart") 
    * @JoinColumn(name="customer_id", referencedColumnName="id") 
    */ 
    private $customer; 

    // ... 

    /** 
    * @return Customer|null 
    */ 
    public function getCustomer() 
    { 
     if ($this->customer->getField1() <= self::VALUE 
      && $this->customer->getField2() >= self::VALUE 
     ) { 
      return $this->customer; 
     } 

     return null; 
    } 
} 

यदि यह एक एक-से-अनेक संबंध, Collection Filtering API (उर्फ मानदंड) मैपिंग द्वारा बनाई संग्रह फिल्टर करने के लिए इस्तेमाल किया जा सकता था:

use Doctrine\Common\Collections\Criteria; 

class Cart 
{ 
    const VALUE = '<some_constant_value>'; 
    /** 
    * @OneToMany(targetEntity="Customer", mappedBy="cart") 
    */ 
    private $customers; 

    // ... 

    /** 
    * @return Customer[]|ArrayCollection 
    */ 
    public function getCustomers() 
    { 
     $expr = Criteria::expr(); 
     $criteria = Criteria::create() 
      ->where($expr->andX(
       $expr->lte('field1', self::VALUE), 
       $expr->gte('field2', self::VALUE) 
      )); 

     return $this->patientProblems->matching($criteria); 
    } 
}