选择一列Doctrine DQL


Select One column Doctrine DQL

我需要一个简单的表列。

以表project为例,其中列为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自动构建的。

这是因为Doctrine用所有对象信息填充响应,所以所有列。

你需要使用不同的补水方法,有很多方法,但我们只关注其中的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()来发送一个proprejson:

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

    这将从select中得到结果,但以键index作为列名,并使用表别名:

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

    这将从select中得到结果,但以键index作为列名,不带表别名:

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

从原则2.10开始,您可以使用标量柱水化:

$query = $em->createQuery('SELECT a.id FROM CmsUser u');
$ids = $query->getResult(Query::HYDRATE_SCALAR_COLUMN);

$ids = $query->getSingleColumnResult();

,这将产生一个平面数组

[412, 959, 1234]

我不确定Doctrine 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;
}

返回一个数组的数组。例如,第一个事件的id是

$result[0]['id'];