Select One column Doctrine DQL
I'm not sure what version of Doctrine j0k was using. It provided some answers, but I did have trouble finding Doctrine_Query and Doctrine_Core classes. I am using Doctrine 2.3.4. The following worked for me.
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;
}
This did however return a array of arrays. ie, the id of the first event was is
$result[0]['id'];
This is because Doctrine hydrate the response with all the object information, so all columns.
You need to use a different hydration method, there are many one, but let's focus on 5 of them:
HYDRATE_RECORD
, the default oneHYDRATE_ARRAY
HYDRATE_NONE
HYDRATE_SCALAR
HYDRATE_ARRAY_SHALLOW
You need the HYDRATE_ARRAY_SHALLOW
hydration method. Here's why.
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()));
This will hydrate the result using object, and also hydrate relations (if you use a leftJoin inside your query). Since it returns object, we need to call
toArray()
to be able to send a 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));
This will hydrate result as an array an automatically add the primary key:
[{"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));
This won't hydrate result, and return just values:
[["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));
This will hydrate result from the select but with key index as the column name with the table alias:
[{"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));
This will hydrate result from the select but with key index as the column name without the table alias:
"[{"pro_id":"1"}]"