如何从存储库请求新数据并克服实体管理器坚持return 原则中的同一实体?

How to request fresh data from repository and overcome entity manager persist return of the same entity in doctrine?

我有处理消息的消费者。因为它是一个消费者,所以它在同一请求期间处理所有消息。

所以,我的要求是

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

将在第一个请求中获取 $box,然后在处理具有相同 ID 的另一条消息期间 return 具有 'fixed' 属性的同一实体。所以:

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

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

Update BOX b set b.name = 'newValue'

但消费者会拿走盒子并告诉我,$box->getName() 仍然是 'fooBox'

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

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

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

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

如果您使用任何标准 \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(可能在自定义存储库方法中)是另一种方法。