我使用API-Platform通过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-关系,但我不确定它是否适用于多个结果集,因为示例是一本书对一位作者。然而,我的场景是一个参与者对多个用户。
此外(我可能需要以更直接的方式来处理这个问题(,我使用了一个联接表,这样我就可以为关系分配额外的元数据。因此…参与者>联合表(包含额外数据(>用户(反之亦然(。同样,我可能需要考虑在参与者和用户之间建立直接关系,然后使用ParticipantUserMeta表来保存额外的元数据。然而,目前,我倾向于使用包含关联和附加元数据的联接表。
以下是我的实体的基本信息(省略了大多数不必要的数据(:
用户:
/**
* @ApiResource
* ...
*/
class User implements UserInterface, Serializable
{
/**
* @var int
*
* @ORMId
* @ORMGeneratedValue
* @ORMColumn(type="integer")
*/
private $id;
/**
* @var string
* @ORMColumn(type="string")
* @AssertNotBlank()
*/
private $name = '';
/**
* @ORMOneToMany(targetEntity="AppEntityParticipantRel", 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;
}
}
参与者Rel:
/**
* @ApiResource
* ...
*/
class ParticipantRel
{
/**
* @var int The Participant Id
*
* @ORMId
* @ORMGeneratedValue
* @ORMColumn(type="integer")
*/
private $id;
/**
* @var int
*
* @ORMColumn(type="boolean")
*/
private $primary_contact;
/**
* @var string Relationship notes
*
* @ORMColumn(type="text", nullable=true)
*/
private $notes;
/**
* @ORMManyToOne(targetEntity="AppEntityParticipants", inversedBy="users")
* @ORMJoinColumn(nullable=false)
*/
private $participant;
/**
* @ORMManyToOne(targetEntity="AppEntityUser", inversedBy="participants")
* @ORMJoinColumn(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
*
* @ORMId
* @ORMGeneratedValue
* @ORMColumn(type="integer")
*/
private $id;
/**
* @var string Participant's first name
*
* @ORMColumn(name="name")
* @AssertNotBlank
*/
public $name;
/**
* @ORMOneToMany(targetEntity="AppEntityParticipantRel", 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平台发送数据。任何积极的方向都将不胜感激。
所以,我只需要用Groups选项进行更多的实验(https://api-platform.com/docs/core/serialization#embedding-关系(。将所有相关字段与所有相对元素上的相对组相关联,最终以所需格式返回结果。