gpt4 book ai didi

doctrine-orm - JMS 反序列化对多关系不会通过 orphanremoval 删除

转载 作者:行者123 更新时间:2023-12-04 15:39:37 29 4
gpt4 key购买 nike

我有一个带有 fos restbundle 的 Symfony rest api 构建,我正在反序列化一个 json PUT 请求,以便更新具有多对多关系的学说实体。
但是,配置了orphanremoval=true的多对多子对象。当它们不存在于 json 数据中时,不会从数据库中删除。

PUT 请求负载:

{
"id": 1,
"name":"Some name",
"export_destinations": [
{
"id": 1,
"type": "USER_STORAGE",
"user": {"id": 5}
}
{
"id": 2,
"type": "SYSTEM_STORAGE"
}
]
}

Controller Action :

 /**
* @Rest\Put("{id}")
* @ParamConverter(
* "exportJob",
* converter="fos_rest.request_body",
* options={"deserializationContext"={"groups"={"put"}}}
* )
* @Rest\View(serializerGroups={"details"})
* @param ExportJob $exportJob
* @return ExportJob
*/
public function putAction(ExportJob $exportJob)
{
$this->getManager()->persist($exportJob);
$this->getManager()->flush();

return $exportJob;
}

导出作业实体

/**
* @ORM\Entity()
*/
class ExportJob
{
/**
* @var ArrayCollection|ExportDestination[]
*
* @ORM\OneToMany(targetEntity="ExportDestination", mappedBy="exportJob", cascade={"persist", "remove", "merge"}, orphanRemoval=true)
*/
protected $exportDestinations;

/**
* @param ExportDestination $exportDestination
* @return $this
*/
public function addExportDestination(ExportDestination $exportDestination)
{
$exportDestination->setExportJob($this);
$this->exportDestinations->add($exportDestination);

return $this;
}

/**
* @param ExportDestination $exportDestination
* @return $this
*/
public function removeExportDestination(ExportDestination $exportDestination)
{
$this->exportDestinations->removeElement($exportDestination);
$exportDestination->setExportJob(null);

return $this;
}
}

JMS 元数据

MyProject\ExportBundle\Entity\ExportJob:
exclusion_policy: ALL
properties:
id:
groups: ['list', 'details', 'put']
expose: true
name:
groups: ['list', 'details', 'put', 'patch', 'post']
expose: true
exportDestinations:
groups: ['details', 'put', 'patch', 'post']
expose: true
type: 'ArrayCollection<MyProject\ExportBundle\Entity\ExportDestination>'

我正在使用 DoctrineObjectConstructor

    jms_serializer.object_constructor:
alias: jms_serializer.doctrine_object_constructor
public: false

现在,当我从 json 有效负载的 export_destinations 数组中省略第二个对象时, Controller 操作中的 exportJob 在反序列化后在数组集合中只有一个 exportDestination 对象。
但是当我坚持时,我希望学说从数据库中删除 exportDestination,因为我有 orphanremoval=true .

我认为问题在于 removeExportDestination()方法在反序列化期间永远不会被调用,什么应该在相反的一侧将关系设置为 null。如果没有发生,它不会删除该实体,因为它尚未成为孤儿。

有没有办法让 JMS 在反序列化期间对 ArrayCollections 使用添加/删除方法?

我也试过使用 merge()而不是 persist()但没有任何区别

最佳答案

您对“在反序列化期间永远不会调用 removeExportDestination() 方法”是正确的。

您可以定义 访问器(accessor) 属性(property)做你想做的事:

exportDestinations:
groups: ['details', 'put', 'patch', 'post']
expose: true
type: 'ArrayCollection<AppBundle\Entity\ExportDestination>'
accessor:
getter: "getExportDestinations"
setter: "setExportDestinations"

并在 ExportJob 实体中:
public function getExportDestinations()
{
return $this->exportDestinations;
}

public function setExportDestinations($exportDestinations)
{
// first detach existing related entities.
foreach ($this->exportDestinations as $exportDestination) {
$exportDestination->setExportJob(null);
}
$this->exportDestinations = $exportDestinations;
foreach ($exportDestinations as $exportDestination) {
$exportDestination->setExportJob($this);
}
}

以便在反序列化期间调用“setExportDestinations”并处理关系删除。

话虽如此,我不确定您是否应该使用 orphanremoval=true在关系上,作为

orphanRemoval=true, even if you will remove given ExportDestination from one ExportJob, and then attach to another ExportJob, this ExportDestination will be deleted during persist, because the reference has been deleted.



我建议删除它并找到另一种删除“孤立”ExportDestination 实体的方法。

关于doctrine-orm - JMS 反序列化对多关系不会通过 orphanremoval 删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49573589/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com