我有一个像 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;
}
}