我在Api Platform中有一个实体,例如团队:
<?php
namespace App\Entity;
/**
* @ORM\Entity(repositoryClass="App\Repository\Basketball\TeamRepository")
* @ApiResource(
* routePrefix="/v2",
* normalizationContext={"groups"={"public:read"}, "enable_max_depth"=true},
* iri="http://schema.org/Team",
* collectionOperations={
* "get",
* },
* itemOperations={
* "get",
* },
* )
*/
class Team implements ObjectManagerAware
{
use \App\Entity\Traits\UUIDTrait;
/**
* @ORM\ManyToMany(targetEntity="App\Entity\Basketball\Event", mappedBy="teams")
*/
private $events;
public function __construct()
{
$this->events = new ArrayCollection();
}
/**
* @return Collection|Event[]
*/
public function getEvents(): Collection
{
return $this->events;
}
public function addEvent(Event $event): self
{
if (!$this->events->contains($event)) {
$this->events[] = $event;
$event->addTeam($this);
}
return $this;
}
public function removeEvent(Event $event): self
{
if ($this->events->contains($event)) {
$this->events->removeElement($event);
$event->removeTeam($this);
}
return $this;
}
}
这一切正常,我可以加载团队和事件。我想做的是在API结果上有一个属性,该属性仅返回即将发生的事件(而不是过去的事件)。这样做的“正确”方法是什么?我尝试添加自定义方法,例如
/**
* @return Collection|Event
* @Groups({"public:read"})
*/
public function getRemainingEvents(): ?Collection
{
$qb = $this->em->createQueryBuilder();
$qb->select('e')->from(Event::class, 'e');
$qb->where(
$qb->expr()->orX($qb->expr()->eq('IDENTITY(e.home)', $this->getId()), $qb->expr()->eq('IDENTITY(e.away)', $this->getId()))
);
$qb->andWhere('e.startDate >= :d');
$qb->andWhere('e.startDate >= :d');
$qb->setParameter('d', (new \DateTime())->format('Y-m-d'));
$qb->orderBy('e.startDate', 'ASC');
$query = $qb->getQuery();
return new ArrayCollection($query->getResult());
}
确实可以实现我想要的功能,但是使用application/vnd.api+json
的api结果不会像“ events”属性那样列出“关系”中的事件。我尝试查看自定义过滤器(https://api-platform.com/docs/core/filters/#creating-custom-filters),但不了解该方法对于实体上的自定义方法将如何工作。
我希望remainingEvents
的行为与events
相同,并在响应的“关系”中列出相关项目。
是否可以通过某种方式为序列化程序添加注释或使用过滤器?
答案 0 :(得分:0)
我认为您意识到使用该方法(实体中从数据库检索数据的方法)是错误的。实体应该是虚拟的。
关于您要做什么,我认为您最好的解决方案应该是在“事件”资源中添加DateFilter(https://api-platform.com/docs/core/filters/#date-filter),让您可以进行GET events?startDate[after]=2019-09-18
如果您要从特定的“团队”资源中过滤事件,只需向事件资源中添加另一个过滤器,即搜索过滤器(https://api-platform.com/docs/core/filters/#search-filter)即可指定团队,从而可以执行以下操作:
GET events?startDate[after]=2019-09-18&team=IRIofteam_OR_ID