13

我需要一个简单的表格列。

例如,一个表“项目”,其中包含idnameyear

如果我做:

$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 自动构建的。

4

2 回答 2

36

这是因为 Doctrine 使用所有对象信息来水合响应,因此所有列。

您需要使用不同的补水方法,有很多,但让我们关注其中的 5 个:

  • HYDRATE_RECORD, 默认一个
  • HYDRATE_ARRAY
  • HYDRATE_NONE
  • HYDRATE_SCALAR
  • HYDRATE_ARRAY_SHALLOW

你需要HYDRATE_ARRAY_SHALLOW补水的方法。这就是为什么。

  1. 水合记录

    $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. 水合_无

    $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"}]"
    
于 2013-01-19T09:56:57.117 回答
1

我不确定 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'];
于 2014-03-10T21:10:37.473 回答