首页 > 解决方案 > 如何从存储库中请求新数据并克服实体管理器在学说中持续返回同一实体?

问题描述

我有处理消息的消费者。由于它是消费者,它在同一请求期间处理所有消息。

所以,我的要求就像

$box = $this->boxRepository->findOneBy['id'= > $message->getId()];

将在第一个请求上使用 $box,然后在处理具有相同 ID 的另一条消息期间返回具有“固定”属性的相同实体。所以:

$box->getName() // 'fooBox'

然后从另一个微服务我更改了数据库中的值:

Update BOX b set b.name = 'newValue'

但是消费者会拿着盒子给我看,$box->getName() 仍然是'fooBox'

我可以通过刷新它来获取新值,例如:

$box = $this->boxRepository->findOneBy['id'= > $message->getId()];

$this->em->refresh($box);

但这是一种设置一些强制标志或其他东西的方法,在不刷新的情况下对每个请求获取实际值吗?

标签: symfonydoctrine-orm

解决方案


如果您使用任何标准\Doctrine\ORM\EntityRepository方法

/**
 * @method Entity|null find($id, $lockMode = null, $lockVersion = null)
 * @method Entity|null findOneBy(array $criteria, array $orderBy = null)
 * @method Entity[]    findAll()
 * @method Entity[]    findBy(array $criteria, array $orderBy = null, $limit = null, $offset = null)
 */

您总是在第二次和以后的调用中获得缓存的结果。所以\Doctrine\ORM\EntityManager::refresh从数据库中获取最后的数据是强制性的。

使用 DQL 或本机 SQL(可能在自定义存储库方法中)是另一种方法。


推荐阅读