Доктрина не позволит мне выбрать конкретные поля - PullRequest
10 голосов
/ 27 февраля 2012

Среда 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'

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

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

1 Ответ

30 голосов
/ 29 февраля 2012

Из документации "Синтаксис частичного объекта" :

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

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

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'
...