在结果中嵌入关系

Embedding Relations In Results

我正在使用 API-平台通过 API 传送内容。我在用户和参与者之间存在潜在关系(并非所有用户都会有参与者,但所有参与者都会有至少一个用户)。我的主要目标是将关系的用户数据嵌入到参与者的结果集中,因为该结果将被数据 table 使用,并且让该数据已经存在于结果中而不是执行额外的操作会更有效请求数据。

例如:

{
  "@context": "/api/contexts/Participants",
  "@id": "/api/participants",
  "@type": "hydra:Collection",
  "hydra:member": [
    {
      "@id": "/api/participants/1",
      "@type": "Participants",
      "id": 1,
      "name": "Jeffrey Jones",
      "users": [
        {
          "@id": "/api/users/1",
          "@type": "User",
          "name": "Jenny Jones"
        },
        {
          "@id": "/api/users/2",
          "@type": "User",
          "name": "Jessie Jones"
        }
      ]
    }
  ],
  "hydra:totalItems": 1
}

但是,我不确定这是否可行。我看过 https://api-platform.com/docs/core/serialization#embedding-relations 但我不确定它是否适用于多个结果集,因为示例是一位作者的一本书。但是,我的场景是一个参与者到多个用户。

此外(我可能需要以更直接的方式解决这个问题),我正在使用连接 table 以便我可以为关系分配额外的元数据。所以...参与者 > 联合 table(包含附加数据)> 用户(反之亦然)。同样,我可能需要考虑在参与者和用户之间建立直接关系,然后使用 ParticipantUserMeta table 来保存额外的元数据。但是,目前,我倾向于包含关联以及附加元数据的联接 table。

以下是我的实体的基础知识(省略了大部分不必要的数据):

用户:

/**
 * @ApiResource
 * ...
 */
class User implements UserInterface, \Serializable
{
    /**
     * @var int
     *
     * @ORM\Id
     * @ORM\GeneratedValue
     * @ORM\Column(type="integer")
     */
    private $id;

    /**
     * @var string
     * @ORM\Column(type="string")
     * @Assert\NotBlank()
     */
    private $name = '';

    /**
     * @ORM\OneToMany(targetEntity="App\Entity\ParticipantRel", mappedBy="user")
     */
    private $participants;

    public function __construct()
    {
        $this->participants = new ArrayCollection();
    }

    public function getId(): int
    {
        return $this->id;
    }

    public function getName(): string
    {
        return $this->name;
    }

    /**
     * @return Collection|ParticipantRel[]
     */
    public function getParticipants(): Collection
    {
        return $this->participants;
    }
}

参与者关系:

/**
 * @ApiResource
 * ...
 */
class ParticipantRel
{
    /**
     * @var int The Participant Id
     *
     * @ORM\Id
     * @ORM\GeneratedValue
     * @ORM\Column(type="integer")
     */
    private $id;

    /**
     * @var int
     * 
     * @ORM\Column(type="boolean")
     */
    private $primary_contact;

    /**
     * @var string Relationship notes
     * 
     * @ORM\Column(type="text", nullable=true)
     */
    private $notes;

    /**
     * @ORM\ManyToOne(targetEntity="App\Entity\Participants", inversedBy="users")
     * @ORM\JoinColumn(nullable=false)
     */
    private $participant;

    /**
     * @ORM\ManyToOne(targetEntity="App\Entity\User", inversedBy="participants")
     * @ORM\JoinColumn(nullable=false)
     */
    private $user;

    public function getId (): int
    {
        return $this->id;
    }

    public function getPrimaryContact(): ?bool
    {
        return $this->primary_contact;
    }

    public function getNotes(): ?string
    {
        return $this->notes;
    }

    public function getParticipant(): ?Participants
    {
        return $this->participant;
    }

    public function getUser(): ?User
    {
        return $this->user;
    }
}

参与者

/**
 * @ApiResource
 * ...
 */
class Participants
{
    /**
     * @var int The Participant Id
     *
     * @ORM\Id
     * @ORM\GeneratedValue
     * @ORM\Column(type="integer")
     */
    private $id;

    /**
     * @var string Participant's first name
     * 
     * @ORM\Column(name="name")
     * @Assert\NotBlank
     */
    public $name;

    /**
     * @ORM\OneToMany(targetEntity="App\Entity\ParticipantRel", mappedBy="participant")
     */
    private $users;

    public function __construct() {
        $this->users = new ArrayCollection();
    }

    public function getId (): int
    {
        return $this->id;
    }

    public function getName(): ?string
    {
        return $this->name;
    }

    /**
     * @return Collection|ParticipantRel[]
     */
    public function getUsers(): Collection
    {
        return $this->users;
    }
}

我的问题:我在一个实体内尝试的是可能的吗?如果是的话,我错过了什么?在来这里之前我已经对此进行了很多研究,但没有提出任何解决方案,因为我看到的大多数解决方案都涉及 Twig tpl,但我只是通过 api-platform 发送数据。任何积极的方向将不胜感激。

因此,事实证明我只需要使用群组选项 (https://api-platform.com/docs/core/serialization#embedding-relations) 进行更多试验。将所有相关字段与所有相关实体的相关组相关联最终以所需格式返回结果。