如何在Doctrine 2中检查实体是否发生变化? [英] How to check if entity changed in Doctrine 2?
问题描述
我需要检查持久化实体是否已更改,需要在数据库上进行更新。
我所做的(并没有工作)如下:
I need to check if a persisted entity has changed and needs to be updated on the database. What I made (and did not work) was the following:
$product = $entityManager->getRepository('Product')->find(3);
$product->setName('A different name');
var_export($entityManager->getUnitOfWork()->isScheduledForUpdate($product));
该代码总是打印 false
,我也在检查工作单位之前尝试冲洗,但没有工作。
That code prints always false
, I also tried to flush before check the unit of work, but did not work.
任何人都有建议?
推荐答案
首先我检查一下,你的 setName 函数实际上是在做某事($ this-> name = $ name ...)如果它已经在工作,那么您可以在调用flush时触发的services.yml中定义一个事件侦听器。
The first thing I'd check it that your setName function is actually doing something ($this-> name = $name...) If it's already working, then you could define an event listener on your services.yml that is triggered when you call the flush.
entity.listener:
class: YourName\YourBundle\EventListener\EntityListener
calls:
- [setContainer, ["@service_container"]]
tags:
- { name: doctrine.event_listener, event: onFlush }
然后定义EntityListener
Then you define the EntityListener
namespace YourName\YourBundle\EventListener;
use Doctrine\ORM\Event;
use Symfony\Component\DependencyInjection\ContainerAware;
class EntityListener extends ContainerAware
{
/**
* Gets all the entities to flush
*
* @param Event\OnFlushEventArgs $eventArgs Event args
*/
public function onFlush(Event\OnFlushEventArgs $eventArgs)
{
$em = $eventArgs->getEntityManager();
$uow = $em->getUnitOfWork();
//Insertions
foreach ($uow->getScheduledEntityInsertions() as $entity) {
# your code here for the inserted entities
}
//Updates
foreach ($uow->getScheduledEntityUpdates() as $entity) {
# your code here for the updated entities
}
//Deletions
foreach ($uow->getScheduledEntityDeletions() as $entity) {
# your code here for the deleted entities
}
}
如果您需要知道哪些实体正在更改,但在之后他们会执行某些操作已经保存到数据库中,只需将实体更改为私有数组,然后定义一个从数组中获取实体的onFlush事件。
If you need to know which entities are being changed, but do something with them after they've been saved to the database, just store the entities changed in a private array, an then define a onFlush event that gets the entities from the array.
BTW,to触发此类事件,您需要在实体上添加@ ORM\HasLifecycleCallbacks。
BTW, to trigger this kind of events you need to add the @ORM\HasLifecycleCallbacks on the entity.
这篇关于如何在Doctrine 2中检查实体是否发生变化?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!