2011-07-28 15 views
23

के बिना मूल SQL क्वेरी का उपयोग करना मुझे दो यूनियनों और उपकुंजियों के साथ मूल SQL क्वेरी बनाने की आवश्यकता है। यह लगभग इस तरह दिखेगा:इकाई वर्ग

SELECT res.id, COUNT(*) as count_ids 
FROM (
    SELECT a.id FROM ... a WHERE ... LIKE ('%:param%') 
    UNION ALL 
    SELECT b.id FROM ... b WHERE ... LIKE ('%:param%') 
    UNION ALL 
    ... 
) res 
GROUP BY res.id 
ORDER BY count_ids asc 

परिणाम मेरे आवेदन में उपयोग की जाने वाली किसी भी इकाई से मेल नहीं खाएगा। क्या "अज्ञात" ऑब्जेक्ट के साथ ResultSetMapping बनाना संभव है? या, कम से कम, एक ऐसी संस्था बनाने के लिए संभव है जो अगली बार स्कीमा अपडेट करे, तो तालिका नहीं बनाएगी, इसलिए मैं इसके परिणाम देख सकता हूं?

या ऐसी क्वेरी से निपटने के लिए कोई अन्य सिद्धांत-अनुकूल तरीका है? डेटाबेस में परिवर्तन करना संभव नहीं है, क्योंकि मैं विरासत सामग्री से निपट रहा हूं जिसे स्पर्श नहीं किया जा सकता है। मैं दृढ़ता से भी पसंद करूंगा कि मैंने डेटाबेस पक्ष पर सबकुछ किया है, इसमें PHP का अधिक शामिल नहीं है।

उत्तर

38

क्या आपके पास किसी डोमेन ऑब्जेक्ट पर परिणाम मैप करने की कोई विशेष आवश्यकता है? यदि नहीं, तो आप DBAL एक सादे पुराने क्वेरी, जो एक सरणी वापस आ जाएगी बनाने के लिए, के रूप में the Symfony2 cookbook और the Doctrine DBAL documentation में विस्तृत इस्तेमाल कर सकते हैं:

$conn = $this->container->get('database_connection'); 
$sql = 'SELECT res.id, COUNT(*)...'; 
$rows = $conn->query($sql); 
+0

धन्यवाद, मुझे नहीं पता था कि डीबीएएल में कुछ ऐसा था सिद्धांत। –

+2

http://www.metod.si/get-doctrine2-dbal-connection-for- अलग-अलग डेटाबेस-in-symfony2/ => यदि आप 1 से अधिक डीबी – DOZ

+0

से कनेक्ट करना चाहते हैं तो धन्यवाद, सिद्धांत पर देशी एसक्यूएल है इतनी भयानक, वापस बुनियादी! –

1

उपयोग addScalarResult की विधि ResultSetMapping

$rsm = new ResultSetMapping(); 

$rsm->addScalarResult('cnt', 'cnt'); 
$rsm->addScalarResult('id', 'id'); 

$query = $this->em->createNativeQuery('SELECT count(*) AS cnt, id_column as id FROM your_table group by id', $rsm); 

$result = $query->getResult(); 

var_dump($result); 

परिणाम सरणी:

array (size=1) 
    0 => 
    array (size=2) 
     'cnt' => int 1 
     'id' => int 15 
संबंधित मुद्दे