大家好,我刚开始使用Api-Platform,这个问题困扰了我几个小时。
我有一个Symfony4项目和两个实体:Bill&Abo
账单:
/**
* @ORM\Entity(repositoryClass="App\Repository\BillRepository")
* @ApiResource(attributes={
* "normalization_context"={"groups"={"bill-abo"}}
* })
*/
class Bill {
/**
* @ORM\Id
* @ORM\GeneratedValue
* @ORM\Column(type="integer")
*/
private $id;
/**
* @var \DateTime
*
* @ORM\Column(name="date", type="date", nullable=false)
* @Groups("bill-abo")
*/
private $date;
/**
* @ORM\ManyToOne(targetEntity="App\Entity\Abo", inversedBy="bills")
* @ORM\JoinColumn
* @ApiSubresource
* @Groups("bill-abo")
*/
private $abo;
}
Abo:
/**
* @ORM\Entity(repositoryClass="App\Repository\AboRepository")
* @ApiResource
*/
class Abo
{
/**
* @ORM\Id
* @ORM\GeneratedValue
* @ORM\Column(type="integer")
*/
private $id;
/**
* @var string
*
* @ORM\Column(name="name", type="string", length=50, nullable=false)
*/
private $name;
/**
* @var integer
*
* @ORM\Column(name="price", type="integer", nullable=false)
* @Groups("bill-abo")
*/
private $price;
/**
* @ORM\OneToMany(targetEntity="App\Entity\Bill", mappedBy="abo")
*/
private $bills;
}
当我现在将此网址称为/api/bills
时,我会得到以下数据:
{
"date": "2018-03-14T00:00:00+00:00",
"abo": {
"price": 960
}
},
...
我现在的目标是调用一个类似于以下内容的网址:/api/bills?abo
以得到上面的结果,而当我调用/api/bills
时,我只想要帐单数据(不包含abo数据),就像这样:
{
"id": 14,
"date": "2018-03-08T00:00:00+00:00",
"abo": "/api/abos/1"
},
...
我阅读了文档,特别是有关Group Filter和Property Filter的部分,但我想不出解决方案。
这是否有可能,如果可以,我该如何实现?
感谢您的时间和帮助!
答案 0 :(得分:1)
您可以利用组过滤器。
Bill
这样的@ApiFilter(GroupFilter::class, arguments={"overrideDefaultGroups": true, "whitelist": {"foo"}})
资源类上添加GroupFilter Bill::$abo
属性添加一个新的名为“ foo”的额外组(不要添加至Abo
类中的任何属性)/bills?groups[]=foo