我正在使用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平台发送数据。任何积极的方向将不胜感激。
答案 0 :(得分:0)
因此,事实证明,我只需要使用组选项(https://api-platform.com/docs/core/serialization#embedding-relations)进行更多试验。最终,所有与所有相对实体上的相对组相关联的字段都被关联了,最终以期望的格式返回了结果。