如何在不创建嵌套对象且不使用IRI的情况下发布包含嵌套对象的对象?

时间:2019-12-08 19:41:59

标签: php post doctrine-orm nested api-platform.com

我正在尝试创建一个包含嵌套的Gender对象的Customer对象。

创建客户时,我想传递现有的性别。  ->问题是Api Plateform试图创建我赋予它的嵌套Gender。

我不想使用IRI,而是完全使用嵌套对象。

因此,我使用规范化和非规范化组创建了“客户”实体。

客户实体:

/**
 * @ApiResource(
 *      normalizationContext={"groups"={"customer.read"}},
 *      denormalizationContext={"groups"={"customer.create"}}
 * )
 * @ORM\Table(name="customers")
 * @ORM\Entity(repositoryClass="App\Repository\CustomerRepository")
 */
class Customer
{
...
    /**
     * @ORM\ManyToOne(targetEntity="App\Entity\Gender", inversedBy="customers", cascade={"persist"})
     * @ORM\JoinColumn(nullable=false)
     * @Groups({"customer.read","customer.create"})
     */
    private $gender;

性别实体:

/**
 * @ApiResource(
 *      normalizationContext={"groups"={"gender.read"}},
 *      denormalizationContext={"groups"={"gender.create"}}
 * )
 * @ORM\Table(name="genders")
 * @ORM\Entity(repositoryClass="App\Repository\GenderRepository")
 */
class Gender
{
    /**
     * @ORM\Column(type="guid")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="UUID")
     * @Groups({"gender.read","customer.read","customer.create"})
     */
    private $id;

    /**
     * @ORM\Column(type="string",unique=true, length=20)
     * @Groups({"gender.read","gender.create","customer.read","customer.create"})
     */
    private $genderName;

    /**
     * @ORM\Column(type="string",unique=true, length=3)
     * @Groups({"gender.read","gender.create","customer.read","customer.create"})
     */
    private $genderCode;

    /**
     * @ORM\OneToMany(targetEntity="App\Entity\Customer", mappedBy="gender")
     */
    private $customers;

每次我在/ api / customers上发送POST

使用:

{
  "lastname": "string",
  "firstname": "string",
  ...
  "gender": {
    "genderName": "Test",
    "genderCode": "T"
  }
}

每次都会创建性别。.

我如何对ApiPlateform说“不创建嵌套对象,而是使用现有的pls”? 有什么办法解决吗?

非常感谢您。 托尼,

1 个答案:

答案 0 :(得分:0)

您必须将IRI添加到性别中。

{
  "lastname": "string",
  "firstname": "string",
  ...
  "gender": "/genders/id"
}