Возвращайте только определенные поля для определенных групп при сериализации с Symfony 4 - PullRequest
0 голосов
/ 11 апреля 2019

Symfony 4. У меня есть две сущности, Cat и Owner.

class Cat
{
    /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     * @Groups("cats")
     */
    private $id;

    /**
     * @ORM\Column(type="string", length=255)
     * @Groups("cats")
     */
    private $name;

    /**
     * @ORM\ManyToMany(targetEntity="App\Entity\Owner", mappedBy="cat")
     * @Groups("cats")
     */
    private $owners;
}

class Owner
{
    /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     * @Groups("cats")
     */
    private $id;

    /**
     * @ORM\Column(type="string", length=255)
     * @Groups("owners")
     */
    private $name;
}

Моя конечная точка API должна вернуть 2 ключа: owners (список всех владельцев) и cats (список всех кошек с их владельцами).

public function index()
{
    $repository = $this->getDoctrine()->getRepository(Owner::class);
    $owners = $repository->findAll();
    $repository = $this->getDoctrine()->getRepository(Cat::class);
    $cats = $repository->findAll();
    return $this->json([
        'owners' => $owners,
        'cats' => $cats,
    ], 200, [], ['groups' => ['owners', 'cats']]);
}

Это работает, но с 1 проблемой: список cats содержит полную информацию о владельце для каждого владельца, т. Е .:

{
  "owners": [
    {
      "id": 1,
      "name": "John Smith"
    }
  ],
  "cats": [
    {
      "id": 1,
      "name": "Miaow",
      "owners": [ 
        {
          "id": 1,
          "name": "John Smith"
        }
      ]
    }
  ]
}

Я хочу, чтобы ключ owners в объекте cat возвращал только id владельца, например:

{
  "owners": [
    {
      "id": 1,
      "name": "John Smith"
    }
  ],
  "cats": [
    {
      "id": 1,
      "name": "Miaow",
      "owners": [ 
        1
      ]
    }
  ]
}

Ответы [ 2 ]

0 голосов
/ 11 апреля 2019

Вы можете использовать геттер для определенной группы и с конкретным сериализованным именем.

В Cat:

/**
 * @Groups("cats")
 * @SerializedName("owners")
*/
public function getOwnersIds(): iterable
{
    return $this->getOwners()->map(function ($owner) {
        return $owner->getId();
    })->getValues();
}
0 голосов
/ 11 апреля 2019

Переопределить отображение поля.

См. Документацию к доктрине: https://www.doctrine -project.org / проекты / Доктрина-ОРМ / ы / 2,6 / ссылки / наследования mapping.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...