Как получить только имя родителей и детей?

Имею отношения Статья + Комментарий.

Этот:

$queryBuilder = $em->createQueryBuilder();
$queryBuilder->select('a, c')
    ->from(Article::class, 'a')
    ->leftJoin('a.comments', 'p');
$articles = $queryBuilder->getQuery()->getResult();

работает правильно, но мне нужно меньше данных, поэтому я пытаюсь:

$queryBuilder = $em->createQueryBuilder();
$queryBuilder->select('a.name, c')
    ->from(Article::class, 'a')
    ->leftJoin('a.comments', 'p');
$articles = $queryBuilder->getQuery()->getResult();

и у меня ошибка:

[Semantical Error] line 0, col -1 near 'SELECT a.name,': Error: Cannot select entity through identification variables without choosing at least one root entity alias.

Если я использую:

$queryBuilder->select('a.name, c.title')

то у меня есть категории с ключевым словом «title» из первого комментария статьи.

Если я использую:

$queryBuilder->select('a.name, a.comments')

то у меня ошибка:

[Semantical Error] line 0, col 15 near 'comments FROM': Error: Invalid PathExpression. Must be a StateFieldPathExpression.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
1
59
3

Ответы 3

Если ваше отношение настроено правильно, вы можете получить свои комментарии, вызвав эту команду:

$article->getComments();

В левом соединении вы добавляете комментарии к «p», но вы пытаетесь получить доступ к комментариям с помощью «c» в выбранном вами элементе. Если у вас ->leftJoin('a.comments', 'c'), тогда у вас должен быть доступ к 'c.title' в вашем select. Если это не сработает, вам может потребоваться проверить, правильно ли установлены отношения между вашими доктринами в ваших организациях.

Действительно, если вы хотите сохранить объектно-ориентированный доступ к данным, вам нужен корневой элемент (в вашем случае Article), который используется для перехода к другим объектам в вашей структуре. В вашем случае это просто - у вас есть только Comment (о котором мы знаем)

Итак, если вы хотите загружать меньше данных, вы также:

  1. Переключитесь на загрузку массива getArrayResult() вместо getResult(). При этом вы можете выбирать, какие поля загружаются, но терять объекты. Все, что вы делаете, придется делать через обход массива. Пример:

    echo $article['comments'][0]['title'];
    
  2. В качестве альтернативы вы можете выбрать загрузку объектов PARTIAL. Плюсы в том, что вы сохраняете доступ к объектам, но минусы в том, что вам нужно немного изменить свой SQL. Например:

    $queryBuilder->select('PARTIAL a.{name}', 'c')
        ->from(Article::class, 'a')
        ->leftJoin('a.comments', 'c');
    
    $data = $queryBuilder->getQuery()->getResult();
    

Имейте в виду, что для незагруженных полей установлено значение NULL, поэтому это может привести к неожиданным попыткам разыменования нулей.

Надеюсь это поможет...

Другие вопросы по теме