AlekseyArh
@AlekseyArh
Кибер существо

Как создать сущность связанную в кастомной таблицей?

Подскажите решение.
Если две сущности А и Б, они межу собой связаны (многие ко многим), получается три таблицы A, Б и A_Б.
Мне нужно вывести все А, при этом подсчитав сколько с ними связано Б.
Это сделать не сложно, так как есть свойства inversedBy и mappedBy, но проблема доктрины что она делает лишний join.
Примерно так:
SELECT A.*, count(DISTINCT Б.ID) FROM A
LEFT JOIN А_Б ON А_Б.A_ID = A.ID
LEFT JOIN Б ON Б.ID =  А_Б.Б_ID

То есть она сначала смотрит связку, потом вытаскивает связные сущности, потом считает их, а могла бы просто подсчитать эти сущности в таблице связей.
SELECT A.*, count(DISTINCT А_Б.Б_ID) FROM A
LEFT JOIN А_Б ON А_Б.A_ID = A.ID


Я вышел из ситуации получая $query->getSql(); вырезая от туда лишний LEFT JOIN, запрос вместо 10 сек. стал выполнятся меньше одной.
Но в другом месте есть запрос, который передаётся в paginator, там дополнительно фильтруется и сортируется, порезать запрос а потом вернуть его в такое состояние что бы paginator его принимал у меня не получилось.

Кажется должно быть какое то адекватное решение. Например создать третью сущность под названием AБ, которая будет смотреть на таблицу A_Б и пользоваться ей в query builder.

Много часов разного волшебства
@ORM\MappedSuperclass, Entity(readOnly=true), @ORM\JoinColumn, @ORM\Column, mappedBy, inversedBy

Но у меня не получается. Создал сущность, исключил её через DoctrineUpdateCommand, что бы не пыталась обновить таблицу. Прописал все связи, но выдаётся ошибка
The association А#bSimple refers to the owning side field Б#bId which does not exist.
Свойства bId это поле b_id в таблице связей,
/**
     * @var integer
     * @ORM\JoinColumn(name="b_id")
     */
    protected $bId;

То есть и поле и таблица всё это есть физически.

Думал может в доктрине есть событие которое позволит поправить SQL перед отправкой в базу, но не нашёл.
  • Вопрос задан
  • 177 просмотров
Пригласить эксперта
Ответы на вопрос 1
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы