在对具有一对一关系的Symfony表单进行验证后检测更改


Detecting an change after the validation of an Symfony form with an one-to-one relation

我使用Symfony产品表单。这可以由用户更改。用户保存表单后,我想知道产品中是否有任何更改。

表单使用产品的实体。该产品与实体价格呈一对一关系。由于存在着多重一对一的关系,价格为折扣等。价格实体有一组数据,如priceTypecurrencyvalue

是一个一对一的单向,只有从产品到价格。产品实体有以下注释:

 /**
 * @ORM'OneToOne(targetEntity="Price")
 * @ORM'JoinColumn(name="price_sales_id", referencedColumnName="id")
 */
private $priceSales;

保存并验证表单后,我使用以下代码进行比较:

$uow = $em->getUnitOfWork();
$uow->computeChangeSets();
$changeSet = $uow->getEntityChangeSet($product);

$changeSet对象返回产品中所做的更改,但不返回在一对一关系中所做的更改。是否有一种方法可以检测相关实体中的变化?

首先,不要使用computeChangeSets(),因为你要修改UnitOfWork,这可能会造成很大的麻烦。

第二,我很确定Product是你和Price关系的inversedSide(你可以通过检查注释来验证:如果你把mappedBy变成了Productprice注释,那么你就变成了inversedSide)。

Doctrine只查找关系的owningSide (inversedBy注释)的变化。

一旦你切换了这些边,你可以computeChangeSets(我真的建议不要这样做)或做任何你需要做的。

对我来说,最好的策略(不涉及切换关系的各个方面,即使您应该停下来重新考虑各个方面是否正确)是实现Doctrine实体侦听器并侦听preUpdate事件