2013-01-02 31 views
6

मैं नियमित रूप से एक परिदृश्य है, जहां मैं एक विशिष्ट मूल्य के साथ एक इकाई क्वेरी करना चाहते हैं के पार चलो:क्या आईएस न्यूल और =: मूल्य 2 डीक्यूएल में मूल्य जोड़ने का एक आसान तरीका है?

$query = $em->createQuery('SELECT e FROM Entity e WHERE e.parent = :parent'); 
$query->setParameter('parent', $parent); 

अक्सर, यह Null मूल्य हो सकता है लेकिन WHERE e.parent = NULL कोई परिणाम प्राप्त होते हैं, मेरे जैसे चारों ओर हैक करने के लिए मजबूर कर इस:

if ($parent === null) { 
    $query = $em->createQuery('SELECT e FROM Entity e WHERE e.parent = IS NULL'); 
} 
else { 
    $query = $em->createQuery('SELECT e FROM Entity e WHERE e.parent = :parent'); 
    $query->setParameter('parent', $parent);  
} 

जब मैं एसक्यूएल/DQL में NULL != NULL के पीछे तर्क को समझते हैं, तथ्य यह है, परिणाम वास्तव में इस मामले में कष्टप्रद है।

क्या यह क्वेरी करने के लिए कोई क्लीनर तरीका है, जब पैरामीटर शून्य हो सकता है?

+0

क्या मेरा उत्तर सही नहीं है? – ThaDafinser

उत्तर

0

आप क्वेरी बिल्डर का उपयोग कर सकते हैं:

$em = \Zend_Registry::get('em'); 

$qb_1 = $em->createQueryBuilder(); 

$q_1 = $qb_1->select('usr') 
->from('\Entities\user', 'usr') 
->where('usr.deleted_at IS NULL') 
->orWhere('usr.status='.self::USER_STATUS_ACTIVE) 
->andWhere('usr.account_closed_on is null'); 

$q_1->getQuery()->getResult(); 
+1

मुझे लगता है कि आप इस सवाल को गलत समझते हैं! – Benjamin

1

यह इस समय संभव नहीं है। (खुद के लिए कई तरीकों का प्रयास किया)।

bindValue()null केवल INSERT/UPDATE मूल्य बाध्यकारी के लिए काम करता है।

मुझे लगता है कि सीमा पीडीओ या एसक्यूएल सिंटेक्स में है और सिद्धांत नहीं है।

ताकि आप केवल पूरे क्वेरी के बजाय, जहां हिस्सा "नकल" करने की जरूरत है आप, QueryBuilder उपयोग कर सकते हैं: http://doctrine-dbal.readthedocs.org/en/latest/reference/query-builder.html#where-clause

संपादित करें: सिद्धांतhttps://dev.mysql.com/doc/refman/5.0/en/comparison-operators.html#operator_equal-to

दुख की बात है: यह देशी एसक्यूएल में संभव है उस ऑपरेटर नहीं है: http://doctrine1-formerly-known-as-doctrine.readthedocs.org/en/latest/en/manual/dql-doctrine-query-language.html#operators-and-operator-precedence

0

बस एक ही समस्या को हल करने की कोशिश कर रहा था और मुझे वास्तव में PostgreSQL के लिए समाधान मिला।

$sql = 'SELECT * FROM company WHERE COALESCE(:company_id, NULL) ISNULL OR id = :company_id;' 
$connection->executeQuery($sql, ['company_id' => $id]); 

पर $id दिया यह विशेष कंपनी या सभी देता है, अगर null पारित हो जाता है के आधार पर। समस्या यह प्रतीत होती है कि पार्सर यह नहीं जानता कि आप वास्तव में तर्क के साथ क्या करने जा रहे हैं, इसलिए इसे COALESCE फ़ंक्शन में पास करके यह जानता है कि यह इसे किसी फ़ंक्शन में पास कर रहा है, इसलिए समस्या हल हो गई है।

तो अगर यह "शुद्ध" एसक्यूएल समाधान में काम करना शुरू कर देता है, तो इसे डीक्यूएल के अंदर उपयोग करना कोई समस्या नहीं होनी चाहिए। मैंने कोशिश नहीं की लेकिन सिद्धांत में COALESCE समर्थन होना चाहिए ताकि DQL अपडेट करना आसान हो।