#php #symfony #serialization
#php #symfony #сериализация
Вопрос:
Symfony 4. У меня есть две сущности, Cat
и Owner
.
class Cat
{
/**
* @ORMId()
* @ORMGeneratedValue()
* @ORMColumn(type="integer")
* @Groups("cats")
*/
private $id;
/**
* @ORMColumn(type="string", length=255)
* @Groups("cats")
*/
private $name;
/**
* @ORMManyToMany(targetEntity="AppEntityOwner", mappedBy="cat")
* @Groups("cats")
*/
private $owners;
}
class Owner
{
/**
* @ORMId()
* @ORMGeneratedValue()
* @ORMColumn(type="integer")
* @Groups("cats")
*/
private $id;
/**
* @ORMColumn(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
]
}
]
}
Ответ №1:
Вы можете использовать геттер для определенной группы и с определенным сериализованным именем.
В Cat
:
/**
* @Groups("cats")
* @SerializedName("owners")
*/
public function getOwnersIds(): iterable
{
return $this->getOwners()->map(function ($owner) {
return $owner->getId();
})->getValues();
}
Комментарии:
1. Спасибо. Поскольку
$this->getOwners()
возвращает коллекцию, а не массив, это не совсем работает. Но вы указали мне правильное направление. Это работает :return $this->getOwners()->map(function ($owner) { return $owner->getId(); })->getValues();
. Если вы обновите свой ответ, я отмечу его правильно.
Ответ №2:
Переопределите отображение поля.
Смотрите Документацию doctrine: https://www.doctrine-project.org/projects/doctrine-orm/en/2.6/reference/inheritance-mapping.html