我有一个像 Bellow 一样的存储库。
代码首先检查项目是否已经在表中。
如果不是,它会下载数据,然后将其存储到表中。
如果它已经在表中,它只会返回记录。
但是有时在它检查表中的项目之后,它仍然会去尝试下载并存储该项目,即使它已经存在,从而产生密钥冲突,但这绝不应该发生,因为它只是搜索并没有找到它。
注意事项:
- 如果我禁用 $query->useResultCache(true) 我没有问题。
- 这是唯一在桌面上工作的过程。
- 这是代码中唯一将项目添加到表中的地方。
- 此代码是从 symfony2 控制台命令调用的。
- Memcache 是为学说 2 设置的缓存。
- Memcached 在本地运行。
- 使用 arraycache 时也会产生错误。
- 此查询每秒运行多次。
类 ItemRepository 扩展 EntityRepository { 公共函数 findOrFetch($id) { $item = $this->findItem($id); 如果($项目!=空) 返回$项目; 别的 { $itemData = $this->fetchItem($id); $ 项目 = 新项目(); $item->setId($id); $item->setName($itemData['name']); $this->getEntityManager()->persist($item); $this->getEntityManager()->flush(); } } 私有函数 findItem($id) { $查询 = $这个 ->getEntityManager() ->createQuery('SELECT i from MonkeyWire\WowProfToolsBundle\Entity\Item i WHERE i.id = ?1'); $query->setParameter(1, $id); $query->useResultCache(true); 返回 $query->getOneOrNullResult(); } 私有函数 fetchItem($id) { $api = 新客户端(); $api->setRequest(new Curl()); 尝试 { $itemData = $api->getItemsApi()->getItem($id); } 捕捉(NotFoundException $e) { $itemData['name'] = "na"; } 返回 $itemData; } }