Symfony 5-仅从实体中恢复几个字段

uxh89sit  于 2022-11-16  发布在  其他
关注(0)|答案(2)|浏览(182)

我想创建一个路由,它将返回我的一个实体的列表,其中只有一些字段。
我认为这可以通过序列化组来实现,但这可能不是最简单的方法。
因此,我认为只需添加一个名为special_get的新自定义路由,以使用normalization_groupuser:special进行测试,如下所示:

/**
 * @ApiResource(
 *     attributes={
 *          "normalization_context"={"groups"={"user:read", "user:list", "user:special"}},
 *          "denormalization_context"={"groups"={"user:write"}},
 *          "order"={"availabilities.start": "ASC"}
 *     },
 *     collectionOperations={
 *          "get"={
 *              "mehtod"="GET",
 *              "security"="is_granted('ROLE_USER')",
 *              "normalization_context"={"groups"={"user:list"}},
 *          },
 *        "special_get"={
 *             "method"="GET",
 *             "path"="/user/specialroute",
 *             "normalization_context"={"groups"={"user:special"}}
 *        },
 *     }
 * )
 * @ORM\Entity(repositoryClass=UserRepository::class)
 */

并且只将这个group应用于我想返回的几个字段:

/**
     * @ORM\Column(type="boolean")
     * @Groups({"user:read", "user:list", "user:write", "user:special"})
     */
    private $firstName;

    /**
     * @ORM\Column(type="string", length=255, nullable=true)
     * @Groups({"user:write", "user:read", "user:list",  "user:special"})
     */
    private $photo;

    /**
     * @ORM\OneToMany(targetEntity=Availability::class, mappedBy="entityname", cascade={"remove"})
     * @Groups({"user:read", "user:list", "user:write"})
     * @ApiSubresource()
     */
    private $availabilities;

这确实在swagger界面上创建了一个新的路由,但我得到的500显示:

An error occured
Cannot select distinct identifiers from query with LIMIT and ORDER BY on a column from a fetch joined to-many association. Use output walkers.*

有人知道这个错误可能来自哪里吗?
或者是否有更好的方法来实现在一条特殊路线上从一个实体中只恢复几个字段?
谢谢你!

qjp7pelc

qjp7pelc1#

因此,关于错误消息,您的问题出在order属性中,该属性按availabilities.start属性对结果进行排序,但未添加到规范化组中。
所以你得在这里道:

  • availabilities属性添加到规范化组
  • 删除此属性

据我所知,api平台目前还不支持对每个操作的属性进行排序,似乎不应该。

6uxekuva

6uxekuva2#

您可以使用PropertyFilter来选择特定字段
启用过滤器:

* @ApiFilter(PropertyFilter::class)

导入类use ApiPlatform\Core\Serializer\Filter\PropertyFilter;
现在您可以使用下列查询来筛选序列化属性:

?properties[]=title&properties[]=shortDescription
  • 您可以根据需要添加任意多个属性。*

相关问题