当我这样做的时候
$objectRepository = $objectManager->getRepository(MyEntity::class);
$myEntity = $objectRepository->findOneBy(["some_attribute" => $someValue]);
$myEntity = $objectRepository->findOneBy(["some_attribute" => $someValue]);
Doctrine 正在执行 2 个查询,而不是仅 1 个:
151205 19:32:58 1265 Query SELECT ... WHERE t0.some_attribute = 'some_value' LIMIT 1
151205 19:32:59 1265 Query SELECT ... WHERE t0.some_attribute = 'some_value' LIMIT 1
我想避免使用缓存进行重复查询,我配置了它:
doctrine:
dbal:
...
orm:
auto_generate_proxy_classes: "%kernel.debug%"
naming_strategy: doctrine.orm.naming_strategy.underscore
auto_mapping: true
metadata_cache_driver: array
result_cache_driver: array
query_cache_driver: array
second_level_cache:
enabled: true
log_enabled: true
region_cache_driver: array
使用array
缓存,因为我只是想避免同一请求中的重复查询。
但它不起作用,Doctrine 仍然执行重复的查询而不是使用缓存...
有什么想法吗? 谢谢
最佳答案
这是因为默认情况下 doctrine
未设置为缓存内容。要使您的查询被缓存,您需要手动设置:
$entity = $objectRepository
->createQueryBuilder('a')
->where(...)
->getQuery()
->useQueryCache(true) //setting query to be cached
->useResultCache(true) //setting result to be cached
->getOneOrNullResult();
默认情况下,要使 Doctrine 缓存内容,请检查 this问题
还要确保您处于有效的环境中(通常仅在生产
环境中启用缓存)
关于php - 为什么 Doctrine 2在重复查询时会去DB?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34109497/