在结果中嵌入关系

时间:2018-11-15 17:54:56

标签: doctrine-orm symfony4 api-platform.com

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

例如:

{
  "@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,但不确定该示例是否适用于多个结果集,因为该示例是一本给一位作者的书。但是,我的情况是多个用户参与其中。

此外(而且我可能需要以更直接的方式进行处理),我正在使用联接表,以便可以为关系分配其他元数据。因此...参与者>联合表(包含其他数据)>用户(反之亦然)。同样,我可能需要考虑在参与者和用户之间建立直接关系,然后使用ParticipantUserMeta表来保存其他元数据。但是,目前,我倾向于包含关联以及其他元数据的联接表。

这是我实体的基础(省略了大多数不必要的数据):

用户:

/**
 * @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;
    }
}

ParticipantRel:

/**
 * @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平台发送数据。任何积极的方向将不胜感激。

1 个答案:

答案 0 :(得分:0)

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