2013-01-19 143 views
9

我需要一個簡單的列表。選擇一列原則DQL

例如一個表「項目」,列id,nameyear

如果我做的:

$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} 

它與DQL因爲與本機SQL工作正常。

ORM使用Visual Paradigm自動生成。

回答

26

這是因爲學說用所有的對象信息保存迴應,所以所有的列。

您需要使用不同的保溼方法,there are many one,但讓我們專注於他們的5:

  • HYDRATE_RECORD,默認的
  • HYDRATE_ARRAY
  • HYDRATE_NONE
  • HYDRATE_SCALAR
  • HYDRATE_ARRAY_SHALLOW

您需要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查詢內)。由於它返回一個對象,我們需要調用toArray()是能夠發送黑白配JSON:

    [{"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)); 
    

    這將滋潤結果作爲數組自動添加主鍵:

    [{"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

當然!現在在文檔「Data Hydrators」中找到該章節。我不知道這是關於這個問題的。 非常感謝! ;) –

+0

@ h3g0r_嘗試一下,陣列補水通常比記錄補水更快更輕! – j0k

+0

非常好的解釋,我一直對水合物的工作方式感到困惑,但現在在我心中都清楚了。謝謝 ! – TwystO

0

我不是確定Doctrine j0k使用的是什麼版本。它提供了一些答案,但我在查找Doctrine_Query和Doctrine_Core類時遇到了困難。我正在使用Doctrine 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; 
} 

但是這確實返回了一個數組數組。即第一個事件的ID是

$result[0]['id'];