Я застрял в запросе изначально очень простого доктрины 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;