问题描述
我希望在具有多对多关系的两个表之间使用相同的@groups:当我进入 API 平台 .../api/tags/1 时,我只收到没有“标签”的那个。
{
"id": 1,"title": "A ce monde que tu fais"
}
应用\实体\歌曲
/**
* @Groups({"song:read","song:write"})
* @ORM\ManyToMany(targetEntity=Tag::class,inversedBy="songs",cascade={"persist"})
* @ORM\JoinTable(
* name="song_tag",* joinColumns={
* @ORM\JoinColumn(name="song_id",referencedColumnName="id")
* },* inverseJoinColumns={
* @ORM\JoinColumn(name="tag_id",referencedColumnName="id")
* })
*
*/
private $tags;
应用\实体\标签
/**
* @Groups({"song:read","song:write"})
* @ORM\ManyToMany(targetEntity=Song::class,mappedBy="tags")
*/
private $songs;
我认为这是两者之间的连接表,它没有定义的组。你能帮助我吗? 谢谢
解决方法
你是什么意思:
当我进入 API 平台 .../api/tags/1 时,我只收到没有“标签”的内容。
据我了解,您的问题很可能是由于缺少 normalization context 配置造成的。 Tag
端点(例如 /api/tags/1
)默认未配置为应用 song:read
和 song:write
序列化组,导致这些 Tag
字段被排除在响应负载。
考虑添加 song:read
和 song:write
作为 Tag
端点的默认序列化组。或者最好指定 tag:read
和 tag:write
序列化组并将它们添加到 Song
序列化组。一个简单的例子:
<?php declare(strict_types = 1);
namespace App\Entity;
use ApiPlatform\Core\Annotation\ApiResource;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping as ORM;
/**
* @ORM\Entity
* @ApiResource(
* itemOperations={
* "get"={
* "normalization_context"={
* "groups"={
* "song:read",* },* },* },* },* )
*/
class Song
{
/**
* @Groups({
* "song:read",* "tag:read",* })
*/
private Collection $tags;
}
/**
* @ORM\Entity
* @ApiResource(
* itemOperations={
* "get"={
* "normalization_context"={
* "groups"={
* "tag:read",* )
*/
class Tag
{
/**
* @Groups({
* "tag:read",* "song:read",* })
*/
private Collection $songs;
}
PS:考虑上面的例子建立一个 circular reference。
,由
当我进入 API 平台 .../api/tags/1 时,我只收到没有“标签”的内容。
我的意思是,当我提出请求时,我想取回标签。我已经尝试过了,它适用于 oneToMany 和 oneToOne,但不适用于 ManyToMany。
我想要
{
"id": 1,"title": "world","category": {"id":54,"name":"hello"},"tags": [{"id":12,"name":"city"},{...}]
}
而我只有
{
"id": 1,}
我认为这实际上是两者之间的连接表,它没有定义的组,因为 symfony 没有创建实体,因此没有组...