Symfony5 JMS 序列化程序 - 计算 属性 没有 ORM 注释的模型
Symfony5 JMS Serializer - model with calculated property without ORM annotation
我有这样的模型属性:
/**
* @ORM\Entity(repositoryClass=AssignmentRepository::class)
*/
class Assignment
{
/**
* @ORM\Id
* @ORM\GeneratedValue
* @ORM\Column(type="integer")
*/
private ?int $id;
/**
* @ORM\Column(type="float", nullable=true)
*/
private ?float $sale;
/**
* @ORM\Column(type="float", nullable=true)
*/
private ?float $cost;
/**
* @JMS\Type("integer")
*/
private ?float $marge = null;
....
public function getSale(): ?float
{
return $this->sale;
}
public function setSale(?float $sale): self
{
$this->sale = $sale;
return $this;
}
public function getCost(): ?float
{
return $this->cost;
}
public function setCost(?float $cost): self
{
$this->cost = $cost;
return $this;
}
public function getMarge(): ?float
{
return $this->getSale() - $this->getCost();
}
如您所见,$this->sale 和 $this->cost 是保存在我的数据库中的 ORM 属性。
$this->marge 是一个非映射 属性 并且由费率和成本之间的差异决定。
但是当我使用控制器获取它并使用 JMS 序列化程序对其进行序列化时,$this->marge 属性 不存在。键“marge”不存在。
像这样使用序列化程序获取它:
$result = $this->assignmentRepository->findAll();
return new JsonResponse(
$serializer->serialize($result, JsonEncoder::FORMAT),
Response::HTTP_OK,
[],
true
);
当我这样调试时:
dump($this->assignmentRepository->find(1));
我得到了带有 属性 "marge" = null 的对象(虽然销售额是 500,成本是 400 - 预计是 100)。
当我试图变得明确时:
dump($this->assignmentRepository->find(1)->getMarge());
我得到的值为“100”。为什么?我需要“marge”的值而不需要像这样明确地调用:
$this->assignmentRepository->find(1);
问题:
如何获得包含“销售”、“成本”等所有属性和有效计算值“marge”(未映射的学说实体以及销售和成本之间的差异)的整个对象信息?
你的属性$marge
没设置,你永远不会$this->marge = something
.
Please have a look at the documentation 关于 VirtualProperty
的部分,注释应该在方法 getMarge
之上,因为你的 属性 没有价值
删除 marge
属性 并为 getMarge
方法添加注释
/**
* @JMS\VirtualProperty()
*/
public function getMarge(): float
{
return $this->getSale() - $this->getCost();
}
此外,如果将结果包装成 round()
会更好,因为您使用的是 float 类型
我有这样的模型属性:
/**
* @ORM\Entity(repositoryClass=AssignmentRepository::class)
*/
class Assignment
{
/**
* @ORM\Id
* @ORM\GeneratedValue
* @ORM\Column(type="integer")
*/
private ?int $id;
/**
* @ORM\Column(type="float", nullable=true)
*/
private ?float $sale;
/**
* @ORM\Column(type="float", nullable=true)
*/
private ?float $cost;
/**
* @JMS\Type("integer")
*/
private ?float $marge = null;
....
public function getSale(): ?float
{
return $this->sale;
}
public function setSale(?float $sale): self
{
$this->sale = $sale;
return $this;
}
public function getCost(): ?float
{
return $this->cost;
}
public function setCost(?float $cost): self
{
$this->cost = $cost;
return $this;
}
public function getMarge(): ?float
{
return $this->getSale() - $this->getCost();
}
如您所见,$this->sale 和 $this->cost 是保存在我的数据库中的 ORM 属性。 $this->marge 是一个非映射 属性 并且由费率和成本之间的差异决定。
但是当我使用控制器获取它并使用 JMS 序列化程序对其进行序列化时,$this->marge 属性 不存在。键“marge”不存在。
像这样使用序列化程序获取它:
$result = $this->assignmentRepository->findAll();
return new JsonResponse(
$serializer->serialize($result, JsonEncoder::FORMAT),
Response::HTTP_OK,
[],
true
);
当我这样调试时:
dump($this->assignmentRepository->find(1));
我得到了带有 属性 "marge" = null 的对象(虽然销售额是 500,成本是 400 - 预计是 100)。 当我试图变得明确时:
dump($this->assignmentRepository->find(1)->getMarge());
我得到的值为“100”。为什么?我需要“marge”的值而不需要像这样明确地调用:
$this->assignmentRepository->find(1);
问题:
如何获得包含“销售”、“成本”等所有属性和有效计算值“marge”(未映射的学说实体以及销售和成本之间的差异)的整个对象信息?
你的属性$marge
没设置,你永远不会$this->marge = something
.
Please have a look at the documentation 关于 VirtualProperty
的部分,注释应该在方法 getMarge
之上,因为你的 属性 没有价值
删除 marge
属性 并为 getMarge
方法添加注释
/**
* @JMS\VirtualProperty()
*/
public function getMarge(): float
{
return $this->getSale() - $this->getCost();
}
此外,如果将结果包装成 round()
会更好,因为您使用的是 float 类型