2012-07-05 6 views
28

के साथ एकल पंक्ति परिणाम प्राप्त करें मैं सिद्धांत के साथ एक मूल क्वेरी से लौटाई गई एक पंक्ति प्राप्त करने का प्रयास कर रहा हूं। यहां मेरा कोड है:Doctrine NativeQuery

$rsm = new ResultSetMapping; 
$rsm->addEntityResult('VNNCoreBundle:Player', 'p'); 
$rsm->addFieldResult('p', 'player_id', 'id'); 

$sql = " 
    SELECT player_id 
     FROM players p 
    WHERE CONCAT(p.first_name, ' ', p.last_name) = ? 
"; 

$query = $this->getEntityManager()->createNativeQuery($sql, $rsm); 
$query->setParameter(1, $name); 
$players = $query->getResult(); 

वह अंतिम पंक्ति खिलाड़ियों की एक सूची देता है लेकिन मुझे सिर्फ एक परिणाम चाहिए। मैं उसको कैसे करू?

उत्तर

77

आप $query->getSingleResult() है, जो एक अपवाद फेंक होगा यदि एक से अधिक परिणाम पाए जाते हैं, या अगर कोई परिणाम पाया जाता है का उपयोग कर सकते हैं। (संबंधित phpdoc यहाँ https://github.com/doctrine/doctrine2/blob/master/lib/Doctrine/ORM/AbstractQuery.php#L791 देखें)

वहाँ भी कम प्रसिद्ध $query->getOneOrNullResult() जो एक अपवाद फेंक होगा यदि एक से अधिक परिणाम पाए जाते हैं, और अशक्त वापसी अगर कोई परिणाम पाया जाता है। (संबंधित phpdoc यहाँ https://github.com/doctrine/doctrine2/blob/master/lib/Doctrine/ORM/AbstractQuery.php#L752 देख)

+5

नाइस, getOneOrNullResult के बारे में भी नहीं पता था, लेकिन यह काफी उपयोगी है! –

2

मैं सिर्फ एक परिणाम चाहते

मतलब है कि आप केवल एक पंक्ति लौटा दी की उम्मीद है। तो या तो अपनी क्वेरी को अनुकूलित करें, उदा।

SELECT player_id 
FROM players p 
WHERE CONCAT(p.first_name, ' ', p.last_name) = ? 
LIMIT 0, 1 

(और फिर getSingleResult() का उपयोग के रूप में AdrienBrault द्वारा अनुशंसित) या एक सरणी के रूप में पंक्तियां नहीं लाई और पहले आइटम का उपयोग: अगर वहाँ एक से अधिक

// ... 
$players = $query->getArrayResult(); 
$myPlayer = $players[0]; 
37

दोनों getSingleResult() और getOneOrNullResult() एक अपवाद फेंक होगा परिणाम। इस समस्या को ठीक करने के लिए आप अपने प्रश्न निर्माता को setMaxResults(1) जोड़ सकते हैं।

$firstSubscriber = $entity->createQueryBuilder()->select('sub') 
     ->from("\Application\Entity\Subscriber", 'sub') 
     ->where('sub.subscribe=:isSubscribe') 
     ->setParameter('isSubscribe', 1) 
     ->setMaxResults(1) 
     ->getQuery() 
     ->getOneOrNullResult(); 
+0

किसी भी व्यक्ति के साथ 'SetMaxResults (1) 'का उपयोग करने की कोशिश करने वाले किसी भी व्यक्ति के लिए, यह विधि समर्थित नहीं है [संस्करण 2.3 के लिए दस्तावेज़] (http://www.doctrine-project.org/api/orm/2.3/class-Docctrine। ORM.NativeQuery.html)। –

+0

मेरे पास इस समाधान के लिए एक चिंता है - यदि आप दोनों इस बात पर जोर दे रहे हैं कि 0 या 1 परिणाम होना चाहिए, लेकिन फिर अपवाद को निगलना ('setMaxResults (1)' के माध्यम से) जिसके परिणामस्वरूप उस दावे को झूठा होना चाहिए, तो हो सकता है कि आप अपने डेटा मॉडल या एप्लिकेशन के साथ एक और कपटपूर्ण समस्या का मुखौटा बनाओ। सिर्फ आपकी जानकारी के लिए। – MSC

9

-> getSingleScalarResult() एक सरणी के बजाय एक एकल मान वापस कर देगा।

+1

यही वह है जो मैं अपने SELECT MIN (दिनांक) ... क्वेरी के लिए खोज रहा था। सरणी के बिना तारीख देता है। धन्यवाद। – Strabek

0

एकल पंक्ति लाने के लिए

$result = $this->getEntityManager()->getConnection()->fetchAssoc($sql) 

सभी रिकॉर्ड

$result = $this->getEntityManager()->getConnection()->fetchAll($sql) 

यहाँ आप एसक्यूएल देशी क्वेरी का उपयोग कर सकते हैं, सभी किसी भी मुद्दे के बिना काम करेंगे लाने के लिए।