如何在api平台实体上过滤自定义属性

时间:2019-09-13 19:14:46

标签: symfony doctrine-orm openapi api-platform.com

我在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相同,并在响应的“关系”中列出相关项目。

是否可以通过某种方式为序列化程序添加注释或使用过滤器?

1 个答案:

答案 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