Я хочу сериализовать в объект JSON Category
с набором объектов Presentation
(см. ниже) для использования в REST API.
Конечная точка будет выглядеть примерно так /api/v1/categories/1
Когда набор данных мал и когда Category
имеет только 5-10 связанных Presentations
, результирующий ответ не слишком велик. Однако, когда Category
начинает иметь, скажем, 100 или 200 связанных Presentations
, тогда, очевидно, я не хочу возвращать их все, но хотел бы «разбить» результаты на страницы, например. при вызове конечной точки:
/api/v1/categories/1?page=2
- вернет только "2-я страница"
/api/v1/categories/1/page=3
- вернет "3-я страница"
или даже это может быть с offset
и limit
:
/api/v1/categories/1?offset=20&limit=10
но проблема в следующем: как заставить сериализатор JMS сериализовать только часть коллекции?
/**
* @ORM\Entity(repositoryClass="AppBundle\Repository\CategoryRepository")
*/
class Category
{
/**
* @var string
* @ORM\Column(type="string")
* @JMS\Expose()
* @JMS\Groups({"get-category"})
*/
private $title;
// ...
/**
* @var ArrayCollection
* @ORM\ManyToMany(targetEntity="AppBundle\Entity\Presentation", mappedBy="categories", fetch="EXTRA_LAZY")
* @JMS\Groups({"get-category"})
* @JMS\Expose()
*/
private $presentations;
// ...
}
пс. Я знаю, что, например, если я хочу всегда получать первые 5 элементов коллекции, я могу добавить созданные @VirtualProperty
и нарезать доктрину ArrayCollection
, как показано ниже. Но проблема здесь в том, что я не могу передать параметры смещения этому методу. Поскольку JMSSerializer будет вызывать его внутри где-то...
/**
* @JMS\VirtualProperty()
*
*/
public function getFirstFivePresentations(){
return $this->presentations->slice(0,5);
}
LAZY
илиEAGER
. Однако в моем случае я пометил ассоциацию какEXTRA_LAZY
doctrine-orm.readthedocs.org/projects/doctrine-orm/en/latest/@ORM\ManyToMany(targetEntity="Presentation", mappedBy="categories", fetch="EXTRA_LAZY")
означает, что коллекция не будет загружена полностью. И все запросы SELECT откладываются до момента, когда я вызываюslice(0,5)
, что приводит кSELECT xxx FROM presentation OFFSET 0 LIMIT 5
. - person Dimitry K   schedule 03.02.2016Paginator
gist.github.com/dimkir/e79b2a878c8e0d6aec29, но она ограничивает только количествоCategories
, а не количествоCategory->Presentation
объектов... - person Dimitry K   schedule 03.02.2016