Имею отношения Статья + Комментарий.
Этот:
$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.






Если ваше отношение настроено правильно, вы можете получить свои комментарии, вызвав эту команду:
$article->getComments();
В левом соединении вы добавляете комментарии к «p», но вы пытаетесь получить доступ к комментариям с помощью «c» в выбранном вами элементе. Если у вас ->leftJoin('a.comments', 'c'), тогда у вас должен быть доступ к 'c.title' в вашем select. Если это не сработает, вам может потребоваться проверить, правильно ли установлены отношения между вашими доктринами в ваших организациях.
Действительно, если вы хотите сохранить объектно-ориентированный доступ к данным, вам нужен корневой элемент (в вашем случае Article), который используется для перехода к другим объектам в вашей структуре. В вашем случае это просто - у вас есть только Comment (о котором мы знаем)
Итак, если вы хотите загружать меньше данных, вы также:
Переключитесь на загрузку массива getArrayResult() вместо getResult(). При этом вы можете выбирать, какие поля загружаются, но терять объекты. Все, что вы делаете, придется делать через обход массива. Пример:
echo $article['comments'][0]['title'];
В качестве альтернативы вы можете выбрать загрузку объектов PARTIAL. Плюсы в том, что вы сохраняете доступ к объектам, но минусы в том, что вам нужно немного изменить свой SQL. Например:
$queryBuilder->select('PARTIAL a.{name}', 'c')
->from(Article::class, 'a')
->leftJoin('a.comments', 'c');
$data = $queryBuilder->getQuery()->getResult();
Имейте в виду, что для незагруженных полей установлено значение NULL, поэтому это может привести к неожиданным попыткам разыменования нулей.
Надеюсь это поможет...
Может в этом вам поможет Ошибка: недопустимое выражение пути. Выражение StateFieldPathExpression должно быть сбой при выборе поля.