Symfony 7手动更新数据库后Doctrine未同步显示的问题
解决Symfony 7中直接SQL更新后Doctrine获取旧数据的问题
问题根源
直接用SQL修改数据库后,Doctrine的**一级缓存(EntityManager内存对象缓存)**会保留已加载过的实体实例,后续查询优先取内存中的旧数据,而非重新查询数据库。常规的缓存清理命令(如cache:clear)只清理文件缓存,无法清除进程内存中的一级缓存。
具体解决方法
清除指定实体的一级缓存
在控制器查询实体前,调用EntityManager的clear方法仅清除目标实体的缓存,避免影响其他实体:use App\Entity\Post; use Doctrine\ORM\EntityManagerInterface; // 在showByPostName方法中 public function showByPostName(EntityManagerInterface $em, PostRepository $postRepo) { // 清除Post实体的内存缓存 $em->clear(Post::class); // 再执行查询 $post = $postRepo->findOneBy(['id' => 56]); dd($post); }刷新已加载的实体
如果已经获取到实体实例,可强制从数据库重新加载数据:$post = $postRepo->findOneBy(['id' => 56]); // 刷新实体数据 $em->refresh($post); dd($post);查询时禁用一级缓存
使用QueryBuilder构建查询并设置刷新提示,强制Doctrine重新查询数据库:use Doctrine\ORM\Query; $post = $postRepo->createQueryBuilder('p') ->where('p.id = :id') ->setParameter('id', 56) ->setHint(Query::HINT_REFRESH, true) ->getQuery() ->getOneOrNullResult();重启PHP进程/服务器
若使用PHP-FPM、Symfony本地开发服务器等常驻进程服务,内存中的一级缓存会随进程持续存在,需重启进程才能彻底清除:- 重启PHP-FPM:执行
sudo systemctl restart php-fpm(根据系统调整命令) - 重启Symfony本地服务器:先按
Ctrl+C关闭,再重新运行symfony server:start
- 重启PHP-FPM:执行
内容的提问来源于stack exchange,提问作者A. Cedano
相关产品推荐
相关产品推荐

