Доктрина - Конструктор запросов - Выберите несколько столбцов левого соединения

У меня две сущности:

  • ПРИМЕЧАНИЕ: идентификатор, заголовок, описание, isPublic, пользователь
  • ПОЛЬЗОВАТЕЛЬ: идентификатор, адрес электронной почты, имя, фамилия, пароль, соль, роли, тег

Я хотел бы выбрать только несколько столбцов пользователя, когда я получаю все заметки моей базы данных (например, чтобы не получить пароль пользователя)

Итак, в NoteRepository я сделал такой запрос доктрины:

$qb = $this->createQueryBuilder('n');
//Get the owner of the knowledge
$qb
    ->leftJoin('n.user', 'owner')
    ->addSelect('owner.tag as ownerTag, owner.firstname as ownerFirstname, owner.lastname as ownerLastname')
;

return $qb->getQuery()->getResult(Query::HYDRATE_ARRAY);

(Я настаиваю на том, чтобы сделать это с помощью предложения join, потому что мы можем представить себе нескольких пользователей, таких как владелец заметки)

И я получаю следующий ответ в формате JSON:

[
   {
      "0":{
         "id":6,
         "title":"A1",
         "description":"A1",
         "isPublic":false,
         "ownerTag":"#02a4c022d8",
         "ownerFirstname":"ama",
         "ownerLastname":"ama"
      }
   },
   {
      "1":{
         "id":7,
         "title":"Z1",
         "description":"Z1",
         "isPublic":false,
         "ownerTag":"#00a7bd24g8",
         "ownerFirstname":"z",
         "ownerLastname":"z"
      }
   }
]

Но мне бы хотелось такого ответа:

[
   {
      "0":{
         "id":6,
         "title":"A1",
         "description":"A1",
         "isPublic":false,
         "owner":{
            "tag":"#02a4c022d8",
            "firstname":"ama",
            "lastname":"ama"
         }
      }
   },
   {
      "1":{
         "id":7,
         "title":"Z1",
         "description":"Z1",
         "isPublic":false,
         "owner":{
            "tag":"#00a7bd24g8",
            "firstname":"z",
            "lastname":"z"
         }
      }
   }
]

Я не знаю, как это получить. Спасибо, что помогли мне;)

Что будет, если сделать ->addSelect('owner.tag, owner.firstname , owner.lastname')

Gregoire Ducharme 28.03.2018 17:36

То же самое, что я бы не стал, но с тегом вместо тега владельца и т. д.

Dylan Schmitt 28.03.2018 17:47
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Symfony Station Communiqué - 17 февраля 2023 г
Symfony Station Communiqué - 17 февраля 2023 г
Это коммюнике первоначально появилось на Symfony Station , вашем источнике передовых новостей Symfony, PHP и кибербезопасности.
Управление ответами api для исключений на Symfony с помощью KernelEvents
Управление ответами api для исключений на Symfony с помощью KernelEvents
Много раз при создании api нам нужно возвращать клиентам разные ответы в зависимости от возникшего исключения.
0
2
730
2

Ответы 2

Нашел вот этот https://github.com/Atlantic18/DoctrineExtensions/issues/118

Я не уверен, что вы сможете сделать это прямо с помощью queryBuilder.

Но вы наверняка могли бы сделать это с помощью PHP, работающего над вашим массивом :)

Хорошо, я нашел решение. Мне нужно использовать предложение ЧАСТИЧНЫЙ следующим образом:

$qb = $this->createQueryBuilder('n');
//Get the owner of the knowledge
$qb
    ->leftJoin('n.user', 'owner')
    ->addSelect('PARTIAL owner.{id,tag,firstname,lastname}')
;

return $qb->getQuery()->getResult(Query::HYDRATE_ARRAY);

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