Доктрина не позволяет мне выбирать определенные поля

Фреймворк Symfony содержит файл приложения/консоли, который можно запустить через php для выполнения некоторых задач по обслуживанию. Он также позволяет пользователям выполнять запросы DQL:

# php app/console doctrine:query:dql --hydrate=array \
    'SELECT u.id, u.nameFirst, u.nameLast  FROM DatabaseBundle:User u'  
array
  0 => 
    array
      'id' => string '1' (length=1)
      'nameFirst' => string 'jaroslav' (length=8)
      'nameLast' => string 'rakhmatoullin' (length=13)
  1 => 
    array
      'id' => string '2' (length=1)
      'nameFirst' => string 'Båb Kåre' (length=10)
      'nameLast' => string 'Ytrefoss' (length=8)

Обратите внимание, что я выбрал три определенных столбца. Проблема, с которой я сталкиваюсь, заключается в том, что аналогичный запрос дает мне ошибку при объединении двух таблиц.

# php app/console doctrine:query:dql  --hydrate=array \
    'SELECT u.id , r FROM DatabaseBundle:User u JOIN u.roles r'

  [Doctrine\ORM\Query\QueryException]                   
  [Semantical Error] line 0, col -1 near 'SELECT u.id ,': 
     Error: Cannot select entity through identification variables 
     without choosing at least one root entity alias.  

Следующее возвращает всего пользователя, присоединившегося к его ролям:

# php app/console doctrine:query:dql  --hydrate=array \
     'SELECT u, r FROM DatabaseBundle:User u JOIN u.roles r'

Очевидно, я что-то упускаю.

Есть идеи? Я был бы признателен за ссылки на соответствующие документы (по этому конкретному вопросу).


person Ярослав Рахматуллин    schedule 27.02.2012    source источник
comment
Я не очень хорошо понимаю сообщение об ошибке, но я помню, что сталкивался с похожими сообщениями об ошибках и решил свою проблему, выбрав r.id, поэтому я думаю, вам следует попробовать выбрать больше полей.   -  person greg0ire    schedule 27.02.2012
comment
что насчет этого? 'SELECT u.id , r.* FROM DatabaseBundle:User u JOIN u.roles r'   -  person jere    schedule 27.02.2012
comment
greg0ire правильно. я думаю, что вы не можете выбрать одно поле И объект сущности в таком запросе.   -  person jere    schedule 27.02.2012
comment
@jere r.* кажется эквивалентным r (ORM все равно выбирает все поля, а db никогда не видит «r.*» - где-то согласно документам). Проблема была решена путем явного выбора полей из псевдонима r: SELECT u.id , u.username , r.id, r.title FROM DatabaseBundle:User u JOIN u.roles r   -  person Ярослав Рахматуллин    schedule 27.02.2012


Ответы (1)


Из документация по синтаксису частичных объектов:

По умолчанию, когда вы запускаете DQL-запрос в Doctrine и выбираете только подмножество полей для данной сущности, вы не получаете обратно объекты. Вместо этого вы получаете только массивы в виде плоского прямоугольного результирующего набора, аналогично тому, как если бы вы просто использовали SQL напрямую и объединяли некоторые данные.

Если вы хотите выбрать частичные объекты, вы можете использовать ключевое слово DQL partial.

php console doctrine:query:dql --hydrate array \
  'SELECT partial s.{name ,id}, partial c.{name, id } 
   FROM DatabaseBundle:ProductCategories c 
   JOIN c.suppliers s ORDER BY s.name, c.name'
person Ярослав Рахматуллин    schedule 29.02.2012
comment
Обратите внимание, вы должны включить первичный ключ в частичный запрос, иначе вы получите неприятную ошибку. - person Caspar Harmer; 22.10.2013
comment
Два года спустя я не совсем понимаю свой собственный ответ, но, если я правильно помню, ключ в том, что: каждая категория продукта отображается как c, а каждая category.supplier[] отображается как s. Каждая категория имеет поставщиков, сопоставленных с помощью @annotated-join в классе ProductCategories. Спасибо за все голоса. Думаю 10 достаточно. - person Ярослав Рахматуллин; 20.06.2014
comment
Но что, если вы действительно хотите получить полный объект обратно? Я имею в виду, например, некоторые поля объектов A, а затем весь объект B? - person Sergio Negri; 15.01.2015
comment
то вы добавляете только псевдоним таблицы без точки в строке выбора :) - person Edwin O.; 06.09.2017