BonBonSlick
@BonBonSlick
Junior Web Developer Trainee

Как проверить можно ли делать join на таблицу перед джойном в DQL?

/**
     * @throws JoinIsNotSupportedException
     * @throws ReflectionException
     */
    protected function innerJoinTablesIfNotJoined(
        QueryBuilder $query,
        string $joinToTableName,
        array $checkTablesNamesAliases
    ): QueryBuilder {
        $joinedAliases             = $query->getAllAliases();
        $firstSelectFromTableClass = $query->getRootEntities()[0];
        $paramList                 = $this->getObjectPropertiesNames($firstSelectFromTableClass);
        foreach ($checkTablesNamesAliases as $joinTableAlias) {
            if (false === in_array($joinTableAlias, $paramList, true)) {
                throw  JoinIsNotSupportedException::joinNotSupported($joinToTableName, $joinTableAlias, $paramList);
            }
            if (false === \in_array($joinTableAlias, $joinedAliases, true)) {
                $query->join(\sprintf('%s.%s', $joinToTableName, $joinTableAlias), $joinTableAlias);
            }
        }

        return $query;
    }


Проблема в том, что $query->getRootEntities()[0]; вернет только рут сущность, основную таблицу из которой выборка и на которую джойны. Если у нас 2-й джойн, к примеру
Делаем выборку из table posts -> join -> user -> join -> comments

posts -> join -> user отработает корректно firstSelectFromTableClass === 'posts'
Но вот любой джой уровня 2+ и глубже уже будет падать .
Можнет можно как-то получить метадату полей и их метадату, или проверить на чистом SQL есть ли такое поле.

Проверка необходо дабы избежать джойнов таблиц которых нет.
  • Вопрос задан
  • 30 просмотров
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы