У меня есть объект с именем Content. Это мой абстрактный базовый класс для всех моих других объектов, связанных с контентом.
/** * MyBundle\Entity\Content * * @ORM\Entity(repositoryClass="MyBundle\Repository\ContentRepository") * @ORM\InheritanceType("JOINED") * @ORM\DiscriminatorColumn(name="discr", type="string") * @ORM\Table(name="MyBundle_content") * @ORM\HasLifecycleCallbacks */ abstract class Content
Свойства контента:
Кроме того, у меня есть много разных объектов, которые расширяют Контент.
В моем репозитории ( другого объекта, который не является Контентом и не распространяет Content ) у меня есть довольно сложный запрос, в котором я хочу выбрать «обновленное» поле всех объектов контента (в зависимости от некоторых других не относящихся к делу вещей)
Изменить. Но объект Content соединен с другим объектом с «-> leftJoin (« p.content »,« c ») в этом запросе. То, что я имею в виду, это то, что я в Репозитории совершенно другой Entity, которая имеет отношение к Контенту, поэтому я присоединяюсь к содержанию там с помощью – – leftJoin ('p.content', 'c' ) '(Где p – это Entity, в котором я сейчас находится в репозитории.
Проблема заключается в том, что в этой доктрине запроса объединяется каждый объект Entity, который расширяет Content на таблицу содержимого. Поскольку у меня довольно много сущностей, я получаю ошибку
General error: 1116 Too many tables; MySQL can only use 61 tables in a join
В моем случае мне не нужны все эти объединенные таблицы, потому что информация, в которой я нуждаюсь, содержится только в таблице содержимого.
Есть ли способ запросить таблицу корневых сущностей при использовании конструктора запросов и не писать собственный sql?
Да, есть:
$result = $this->em->getRepository('MyBundle:Content') ->createQueryBuilder('c') ->select('c') ->leftJoin('c.Other', 'p') ->getQuery() ->getArrayResult();
Это будет запрашивать только корневую сущность
В конце я сам написал все SQL-заявление, потому что, присоединяясь к нескольким сущностям, нет возможности просто присоединиться к их базовому объекту вместо фактического класса наследования.
Редактировать: Поговорили с разработчиком доктрины, написать инструкцию SQL самостоятельно – это путь.