Как получить только имя родителя и детей? - PullRequest
0 голосов
/ 23 июня 2018

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

Это:

$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();

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

[Семантическая ошибка] строка 0, столбец -1 рядом с «SELECT a.name»: Ошибка: невозможно выбрать объект с помощью переменных идентификации без выбора хотя бы одного псевдонима корневого объекта.

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

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

, тогда у меня есть категории с ключом 'title' из первого комментария статьи.

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

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

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

[Семантическая ошибка] строка 0, столбец 15 рядом с «комментариями ОТ»: Ошибка: неверное выражение пути.Должно быть StateFieldPathExpression.

Ответы [ 3 ]

0 голосов
/ 23 июня 2018

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

0 голосов
/ 24 июня 2018

Действительно, если вы хотите сохранить объектно-ориентированный доступ к данным, вам нужен корневой элемент (в вашем случае 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, что может привести к неожиданным попыткам разыменования пустых значений.

Надеюсь, что этопомогает ...

0 голосов
/ 23 июня 2018

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

$article->getComments();
...