如何从存储库请求新数据并克服实体管理器坚持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(可能在自定义存储库方法中)是另一种方法。
我有处理消息的消费者。因为它是一个消费者,所以它在同一请求期间处理所有消息。
所以,我的要求是
$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(可能在自定义存储库方法中)是另一种方法。