微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Symfony 在具有 ManyToMany 关系的两个表之间使用相同的 @groups

如何解决Symfony 在具有 ManyToMany 关系的两个表之间使用相同的 @groups

我希望在具有多对多关系的两个表之间使用相同的@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:readsong:write 序列化组,导致这些 Tag 字段被排除在响应负载。

考虑添加 song:readsong:write 作为 Tag 端点的默认序列化组。或者最好指定 tag:readtag: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 没有创建实体,因此没有组...

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。