Моя сущность имеет две самоссылающиеся OneToMany
отношения children
и revisions
.
<?php
namespace App\Entity\CMS;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\ORM\Mapping as ORM;
use JMS\Serializer\Annotation as JMS;
/**
* @ORM\Entity
* @JMS\ExclusionPolicy("ALL")
*/
class Page
{
/**
* @var int
*
* @ORM\Id()
* @ORM\GeneratedValue(strategy="IDENTITY")
* @ORM\Column(type="integer")
*/
protected $id;
/**
* @var Page[]|ArrayCollection
*
* @ORM\OneToMany(targetEntity="CoreBundle\Entity\CMS\Page", mappedBy="parent")
*
* @JMS\Groups({"page_children"})
* @JMS\Expose()
*/
protected $children;
/**
* @var Page[]|ArrayCollection
*
* @ORM\OneToMany(targetEntity="CoreBundle\Entity\CMS\Page", mappedBy="page")
*
* @JMS\Groups({"revisions"})
* @JMS\Expose()
*
*/
protected $revisions;
/**
* @var string
*
* @ORM\Column(type="string", value={"main", "revision"})
*
* @JMS\Expose()
*
*/
protected $type;
#...
}
Выставляю две коллекции - children
и revisions
. Дополнительно выставляется type
- это показатель того, принадлежит ли Page
revisions
или нет.
Запрос {{host}}/api/pages?expand=page_children
возвращает результат, который включает Pages
обоих типов.
{
"id": "1",
"type": "main",
"children": [
{
"id": "3",
"type": "main",
"children": [
{
"id": "5",
"type": "main",
"children": []
},
{
"id": "6",
"type": "revision",
"children": []
}
],
},
{
"id": "4,
"type": "revision",
"children": []
}
],
"id": "2',
"type": "revision",
"children": []
}
Я хотел бы исключить из ответа Pages
тип revision
. Итак, мой окончательный результат будет выглядеть так:
{
"id": "1",
"type": "main",
"children": [
{
"id": "3",
"type": "main",
"children": [
{
"id": "5",
"type": "main",
"children": []
}
]
}
]
}
Обычно для фильтрации результатов я использую LexikFormFilterBundle. Однако в этом случае комбинированный запрос, например:
{{host}}/api/expand=page_children&page_filter[type]=main
работает только для результатов первого уровня.
Я думал о стратегии динамического исключения или Обработчик подписки. К сожалению, я не могу найти решение.