2013-01-19 57 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'];