2013-01-19 39 views
9

मुझे किसी तालिका के लिए एक साधारण कॉलम चाहिए।एक कॉलम सिद्धांत का चयन करें DQL

उदाहरण के लिए कॉलम id, name और year के साथ एक तालिका "प्रोजेक्ट"।

अगर मैं कार्य करें:

$q = Doctrine_Query::create() 
     ->select('a.pro_id') 
     ->from('fndr_proyecto a') 
     ->where('a.pro_id =?',1); 
    $pro = $q->execute(); 
    json_encode($pro->toArray()); 

जवाब

{"id":1,"name":"Project name","year":2013} 

की तरह सभी स्तंभ है, लेकिन मैं केवल एक स्तंभ की जरूरत है। मैं उम्मीद करता हूं:

{"id":1} 

यह डीक्यूएल के साथ है क्योंकि देशी एसक्यूएल काम ठीक है।

ओआरएम विजुअल पैराडिग के साथ स्वचालित रूप से निर्माण कर रहा है।

उत्तर

26

ऐसा इसलिए है क्योंकि सिद्धांत सभी ऑब्जेक्ट जानकारी के साथ प्रतिक्रिया को हाइड्रेट करता है, इसलिए सभी कॉलम।

  • HYDRATE_RECORD, डिफ़ॉल्ट एक
  • HYDRATE_ARRAY
  • HYDRATE_NONE
  • HYDRATE_SCALAR
  • HYDRATE_ARRAY_SHALLOW:

    आप एक अलग जलयोजन विधि, there are many one, का उपयोग लेकिन पर उनमें से 5 ध्यान केंद्रित करते हैं की जरूरत है

आपको HYDRATE_ARRAY_SHALLOW हाइड्रेशन विधि की आवश्यकता है। यहाँ पर क्यों।

  1. HYDRATE_RECORD

    $q = Doctrine_Query::create() 
        ->select('a.pro_id') 
        ->from('fndr_proyecto a') 
        ->where('a.pro_id = ?',1); 
    $pro = $q->execute(array(), Doctrine_Core::HYDRATE_RECORD); 
    var_dump(json_encode($pro->toArray())); 
    

    इस वस्तु का उपयोग कर परिणाम हाइड्रेट जाएगा, और भी संबंधों को हाइड्रेट (यदि आप अपने प्रश्न के अंदर एक leftJoin उपयोग करें)।

    [{"id":1,"name":"Project name","year":2013}]" 
    
  2. HYDRATE_ARRAY

    $q = Doctrine_Query::create() 
        ->select('a.pro_id') 
        ->from('fndr_proyecto a') 
        ->where('a.pro_id = ?',1); 
    $pro = $q->execute(array(), Doctrine_Core::HYDRATE_ARRAY); 
    var_dump(json_encode($pro)); 
    

    इस परिणाम को हाइड्रेट के रूप में एक सरणी एक स्वचालित रूप से प्राथमिक कुंजी जोड़ें: चूंकि यह ऑब्जेक्ट, हम एक propre json भेजने के लिए toArray() कॉल करने के लिए सक्षम होना चाहिए :

    [{"id":"1","pro_id":"1"}]" 
    
  3. HYDRATE_NONE

    $q = Doctrine_Query::create() 
        ->select('a.pro_id') 
        ->from('fndr_proyecto a') 
        ->where('a.pro_id = ?',1); 
    $pro = $q->execute(array(), Doctrine_Core::HYDRATE_NONE); 
    var_dump(json_encode($pro)); 
    

    इस परिणाम को हाइड्रेट नहीं होगा, और सिर्फ लौटने को महत्व देता है:

    [["1"]]" 
    
  4. HYDRATE_SCALAR

    $q = Doctrine_Query::create() 
        ->select('a.pro_id') 
        ->from('fndr_proyecto a') 
        ->where('a.pro_id = ?',1); 
    $pro = $q->execute(array(), Doctrine_Core::HYDRATE_SCALAR); 
    var_dump(json_encode($pro)); 
    

    इस चयन से लेकिन जैसे महत्वपूर्ण सूचकांक के साथ परिणाम हाइड्रेट जाएगा तालिका उपनाम के साथ कॉलम नाम:

    [{"a_pro_id":"1"}]" 
    
  5. HYDRATE_ARRAY_SHALLOW

    $q = Doctrine_Query::create() 
        ->select('a.pro_id') 
        ->from('fndr_proyecto a') 
        ->where('a.pro_id = ?',1); 
    $pro = $q->execute(array(), Doctrine_Core::HYDRATE_ARRAY_SHALLOW); 
    var_dump(json_encode($pro)); 
    

    इस चयन से लेकिन स्तंभ नाम के रूप में प्रमुख सूचकांक के साथ तालिका उर्फ ​​बिना परिणाम हाइड्रेट जाएगा:

    "[{"pro_id":"1"}]" 
    
+0

बेशक! अब दस्तावेज़ "डेटा हाइड्रेटर्स" में अध्याय पाएं। मुझे नहीं पता था कि यह विषय के बारे में था। बहुत बहुत धन्यवाद! ;) –

+0

@ h3g0r_ उन्हें आज़माएं, सरणी हाइड्रेशन रिकॉर्ड हाइड्रेशन की तुलना में अक्सर तेज़ और हल्का होता है! – j0k

+0

बहुत अच्छी व्याख्या, मैं हमेशा हाइड्रेटर्स के काम के बारे में परेशान हूं, लेकिन अब मेरे दिमाग में सब स्पष्ट है। धन्यवाद ! – TwystO

0

मैं नहीं कर रहा हूँ सुनिश्चित करें कि सिद्धांत j0k का कौन सा संस्करण उपयोग कर रहा था। इसने कुछ जवाब दिए, लेकिन मुझे Doctrine_Query और Doctrine_Core कक्षाओं को खोजने में परेशानी हुई। मैं सिद्धांत 2.3.4 का उपयोग कर रहा हूँ। निम्नलिखित मेरे लिए काम किया।

public static function getAllEventIDs($em) { 
    return parent::getAllFromColumn('\path\to\Entity\entityName', 'id', $em); 
} 

public static function getAllFromColumn($tableName, $columnName, $em) { 
    $q = $em->createQueryBuilder('t') 
    ->select("t.$columnName") 
    ->from($tableName, 't'); 

    $q = $q->getQuery(); 

    $result = $q->getResult(\Doctrine\ORM\Query::HYDRATE_SCALAR); 

    return $result; 
} 

हालांकि यह सरणी की एक सरणी वापस कर दिया। यानी, पहली घटना की आईडी

$result[0]['id'];