Doctrine2: Невозможно выбрать сущность через идентификационные переменные, не выбирая хотя бы один псевдоним корня сущности

Я застрял в запросе изначально очень простого доктрины 2. У меня есть объект под названием Категория, у которого есть отношение OneToMany с самим собой (для родительских и дочерних категорий).

/** * @ORM\ManyToOne(targetEntity="Category", inversedBy="children") */ private $parent; /** * @ORM\OneToMany(targetEntity="Category", mappedBy="parent") */ private $children; 

Следующий запрос

 $q = $this->createQueryBuilder('c') ->leftJoin('c.children', 'cc') ->select('c.name as title, cc') ->where('c.parent IS NULL'); 

с ошибкой

Невозможно выбрать объект через идентификационные переменные, не выбирая хотя бы один псевдоним корневого объекта.

Я действительно не понимаю. Если я опускаю часть ->select , запрос работает и дает ожидаемый результат. Я уже искал форум, но не смог найти решение, которое сработало. У кого-нибудь есть предложение? Большое спасибо.

Ваша проблема в том, что вы пытаетесь выбрать одно поле из объекта Category, одновременно выбрав весь объект объединенного объекта. В отличие от обычного SQL, с компонентом QueryBuilder вы не можете выбрать объект только из таблицы, в которую вы входите.

Если вы хотите вернуть свой основной объект Category вместе с дочерними дочерними элементами, вы можете либо сделать ->select(array('c', 'cc')) , либо просто опустить вызов ->select() . Первый будет автоматически выбирать детей, которые вам нужны, в одном запросе. Последнему потребуется другой SQL-запрос, если вы хотите получить доступ к дочерним элементам в основной категории.

Если есть причина, по которой вы хотите, чтобы name было выбрано как title в вашем объекте, вы всегда можете добавить еще одну функцию к своей сущности, которая является псевдонимом для извлечения имени вместо того, чтобы писать его в запросе:

 function getTitle() { return $this->getName(); } 

В вашем запросе отсутствуют некоторые части. Обычный построитель запросов в репо похож

  $q = $this->getEntityManager() ->getRepository('MyBundle:Entity') ->createQueryBuilder(‌​'c') ->select(‌​'c') ->leftjoin(‌​'c.children', 'cc') ->addselect(‌​'cc') ->where(‌​'c.parent is NULL') .... return $q;