微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

php – 如何判断当前事务是否会更改Doctrine 2中的任何实体?

我正在使用Doctrine来保存用户数据,我希望有一个最后的修改字段.
下面是用户按下Save后我想如何保存表单的伪代码

>开始交易
>做很多事情,可能是查询数据库,可能不是
>如果此交易有任何改变

>修改上次更新的字段

>提交事务

有问题的部分是这个交易会改变什么. Doctrtrine可以给我这样的信息吗?

如何判断当前交易中的实体是否已更改?

编辑

只是为了清理,我试图在一个名为User的实体中修改一个名为lastUpdated的字段,如果在提交当前事务时任何实体(包括但不限于User)将被更改.换句话说,如果我启动事务并修改名为Garage的实体的名为nbCars的字段,我希望更新User实体的lastUpdated字段,即使该实体尚未被修改.

解决方法:

这是一个必要的回复,旨在纠正@ColinMorelli发布的内容(因为不允许在生命周期事件监听器中进行刷新 – 是的,在文档中有一个位置说不然,但我们将摆脱它,所以请不要做到这一点!).

您可以通过以下听众简单地收听onFlush

use Doctrine\Common\EventSubscriber;
use Doctrine\ORM\Event\OnFlushEventArgs;
use Doctrine\ORM\Events;

class UpdateUserEventSubscriber implements EventSubscriber
{
    protected $user;

    public function __construct(User $user)
    {
        // assuming the user is managed here
        $this->user = $user;
    }

    public function onFlush(OnFlushEventArgs $args)
    {
        $em  = $args->getEntityManager();
        $uow = $em->getUnitOfWork();

        // before you ask, `(bool) array()` with empty array is `false`
        if (
            $uow->getScheduledEntityInsertions()
            || $uow->getScheduledEntityUpdates()
            || $uow->getScheduledEntityDeletions()
            || $uow->getScheduledCollectionUpdates()
            || $uow->getScheduledCollectionDeletions()
        ) {
            // update the user here
            $this->user->setLastModifiedDate(new DateTime());
            $uow->recomputeSingleEntityChangeSet(
                $em->getClassMetadata(get_class($this->user)), 
                $this->user
            );
        }
    }

    public function getSubscribedEvents()
    {
        return array(Events::onFlush);
    }
}

仅当UnitOfWork包含要提交给DB的更改时,这将更改应用于已配置的User对象(工作单元实际上是您可能定义为应用程序级别状态事务的工作单元).

您可以随时通过致电向ORM注册此订户

$user         = $entityManager->find('User', 123);
$eventManager = $entityManager->getEventManager();
$subscriber   = new UpdateUserEventSubscriber($user);

$eventManager->addEventSubscriber($subscriber);

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐