我需要一个简单的表格列。
例如一个表“项目”,列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}
使用DQL是因为本机SQL工作正常。
ORM是使用Visual Paradigm自动构建的。
答案 0 :(得分:30)
这是因为Doctrine用所有对象信息来包含响应,所有列都是如此。
您需要使用不同的水合方法there are many one,但让我们关注其中的5个:
HYDRATE_RECORD
,默认HYDRATE_ARRAY
HYDRATE_NONE
HYDRATE_SCALAR
HYDRATE_ARRAY_SHALLOW
您需要HYDRATE_ARRAY_SHALLOW
水合方法。这就是原因。
<强> 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()));
这将使用object水合结果,并且还会保持水合关系(如果在查询中使用leftJoin)。由于它返回对象,我们需要调用toArray()
才能发送一个propre json:
[{"id":1,"name":"Project name","year":2013}]"
<强> 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"}]"
<强> 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"]]"
<强> 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水合结果,但使用键索引作为列名称,并使用表别名:
[{"a_pro_id":"1"}]"
<强> 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水合结果但使用键索引作为列名而不使用表别名:
"[{"pro_id":"1"}]"
答案 1 :(得分: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'];