doctrine2 - Doctrine 2: Subquery alias creates an extra level in results -
consider following dql:
select   a,   (select count(c.id) comment c c.article_id = a.id) num_comments article   i expect result contain article columns plus num_comments on same level, instead article columns wrapped in array @ index 0:
array(   0 => array(     0 => array(       "id" => 1,       "title" => "title",     ),     "num_comments" => 15   ),   1 => array(     0 => array(       "id" => 2,       "title" => "title",     ),     "num_comments" => 20   ) );   how keep article columns , fields on same level?
i'll split answer in short , long explanation (and alternate answers).
short explanation:
select a.field1      , ...      , a.fieldn      , (select count(c.id) comment c c.article_id = a.id) num_comments    article   then hydrate array , return you're expecting.
long explanation:
whenever refer entity (in case, "select a"), means requesting return entire entity isolated other element. doctrine default assign entity index 0 , goes on depending on how many entities you're selecting. change behavior, have alias entity, did sub-query:
select article      , (select count(c.id) comment c c.article_id = a.id) num_comments    article   this return like:
array(   0 => array(     "article" => array(       "id" => 1,       "title" => "title",     ),     "num_comments" => 15   ),   1 => array(     "article" => array(       "id" => 2,       "title" => "title",     ),     "num_comments" => 20   ) );   if looking not return entire entity, can use partial support , return fields you're interested in. let's support want id (mandatory, because it's entity identifier) , title:
select partial a.{id, title} article      , (select count(c.id) comment c c.article_id = a.id) num_comments    article   another approach encapsulating result dto. provide more oo control when decide hydrate values object. dql this:
select new articledto(a, count(c.id))    article   left join a.comments c  group a.id   the reason why cannot place entire sub-query argument due limitation on dql. none ever requested full sub-query, follows jpa suggests scalarexpression.
cheers,
guilherme blanco
Comments
Post a Comment