如何对嵌套数据进行非规范化时使用自定义标识符(而不是主键)?
我已经在使用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
。
<?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;
...
<?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;
...