API平台:使用自定义标识符对嵌套数据进行非规范化序列化(不是实体主键)

时间:2019-03-30 14:49:12

标签: symfony4 api-platform.com

如何对嵌套数据进行非规范化时使用自定义标识符(而不是主键)?

我已经在使用Groups来嵌套数据,以便对资源进行规范化/非规范化。

我有以下用于创建JSON的JSON:

  • 发票
    • 发票行
      • 项目
{
    "total": "1060.000",
    "paid": "1100.000",
    "status": true,
    "invoiceLine": [
        {
            "price": "460.000",
            "quantity": 1,
            "item": {
                "clientItemId": 9,
                "name": "laptop",
                "price": "13000",
                "category": "/categories/2"
            }
        },
        {
            "price": "600.000",
            "quantity": 2,
            "item": {
                "clientItemId": 10,
                "name": "screen",
                "price": "300.000",
                "category": "/categories/2"
            }
        }
    ]
}

如何使用clientItemId而不是实体id确保不总是创建(复制)项目?

  

注意:由于我有不同的客户端,所以我不能使用clientItemId作为主键,并且两个客户端的clientItemId可能具有相同的值(可以将其视为给定的唯一引用代码)由客户),这就是为什么我有自己的生成值id

实体类

api / src / Entity / InvoiceLine.php

<?php

namespace App\Entity;

use ApiPlatform\Core\Annotation\ApiResource;
use Symfony\Component\Serializer\Annotation\Groups;
use Symfony\Component\Validator\Constraints as Assert;
use Doctrine\ORM\Mapping as ORM;

/**
 * @ApiResource()
 * @ORM\Entity(repositoryClass="App\Repository\InvoiceLineRepository")
 */
class InvoiceLine
{
    /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     *
     * @Groups({"order"})
     */
    private $id;

    /**
     * @ORM\Column(type="decimal", precision=15, scale=2)
     *
     * @Groups({"order"})
     */
    private $price;

    /**
     * @ORM\Column(type="integer")
     *
     * @Groups({"order"})
     */
    private $quantity;

    /**
     * @ORM\ManyToOne(
     *     targetEntity="App\Entity\Invoice",
     *     inversedBy="InvoiceLines"
     * )
     * @ORM\JoinColumn(nullable=false)
     */
    private $invoice;

    /**
     * @ORM\ManyToOne(
     *     targetEntity="App\Entity\Item",
     *     cascade={"persist"}
     * )
     * @ORM\JoinColumn(nullable=false)
     *
     * @Groups({"order"})
     */
    private $item;
...

api / src / Entity / Item.php

<?php

namespace App\Entity;

use ApiPlatform\Core\Annotation\ApiResource;
use ApiPlatform\Core\Annotation\ApiSubresource;
use ApiPlatform\Core\Annotation\ApiProperty;
use Symfony\Component\Serializer\Annotation\Groups;
use Doctrine\ORM\Mapping as ORM;

/**
 * @ApiResource()
 * @ORM\Entity(repositoryClass="App\Repository\ItemRepository")
 */
class Item
{
    /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     *
     * @Groups({"order"})
     */
    private $id;

    /**
     * @ORM\Column(type="integer", nullable=true)
     *
     * @Groups({"order"})
     */
    private $clientItemId;

    /**
     * @ORM\Column(type="string", length=255)
     *
     * @Groups({"order"})
     */
    private $name;

    /**
     * @ORM\Column(type="decimal", precision=15, scale=3)
     *
     * @Groups({"order"})
     */
    private $price;

    /**
     * @ORM\ManyToOne(targetEntity="App\Entity\ItemCategory", inversedBy="Items")
     * @ORM\JoinColumn(nullable=false)
     *
     * @Groups({"order"})
     */
    private $ItemCategory;
...

0 个答案:

没有答案