symfony - 如何从存储库中请求新数据并克服实体管理器在学说中持续返回同一实体?
问题描述
我有处理消息的消费者。由于它是消费者,它在同一请求期间处理所有消息。
所以,我的要求就像
$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);
但这是一种设置一些强制标志或其他东西的方法,在不刷新的情况下对每个请求获取实际值吗?
解决方案
如果您使用任何标准\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(可能在自定义存储库方法中)是另一种方法。
推荐阅读
- mysql - MySQL - 使用其他查询条件,如果另一个查询条件没有返回结果
- sql-server - SQLAlchemy-1.4.21 SQL Server pyodbc 连接错误
- php - GraphQL - 按属性排序不起作用
- flutter - 如何在使用 file_picker 时访问 Flutter 中的列表元素?
- excel - 如何使用 for 循环来计算 Excel VBA 工作表上每列中零的数量?
- azure-devops - DevOps Release Pipeline 未设置 IIS 网站的应用程序池
- android - 什么是 Android 的“中止”错误,为什么 Firebase Crashlytics 没有捕捉到它?
- angular - Angular - 对象可能是“null”:错误 TS7052:元素隐式具有“任何”类型,因为类型为“AbstractControl”
- android - 如何为 Uber-eats android 等菜单选择创建动态复选框组?
- python - Python SocketIO: BadNamespaceError: / is not a connected namespace