Doctrine2,在重复键上重试不同值的插入

时间:2013-07-25 11:57:44

标签: doctrine-orm entity flush duplicates

我正在尝试创建某个哈希。遵循以下路径:

  1. 使用$ hash
  2. 上的唯一键创建一些哈希对象
  3. 构造函数填充种子以生成实际的$ hash
  4. 尝试保存
  5. 如果由于错误23000(重复密钥)而导致保存失败,请进行不同的散列并重复,直到创建一个尚不存在的唯一散列。
  6. 现在这是我的问题。使用Doctrine2,当查询因SQL错误而失败时,它会关闭EntityManager。在我的情况下,没有问题因为我会重试它。

    一种解决方案是在哈希已存在的情况下搜索数据库。由于非常非常低的碰撞量(md5)以及尽可能快地完成任务的需要(我可以节省的每一分钱都值得),我想跳过检查。

    我认为值得一试的另一个解决方案是clone实体经理。但是,在实体管理器内部已经传递给内部对象,它们不会被克隆,而是通过引用传递。

    第三种解决方案是使用注册表并创建新的实体管理器。但是,在此对象之外,我将没有合适的实体管理器:

    • 对象A得到EM - >查询
    • 对象B得到EM - >查询>错误>创造新的EM
    • 对象C得到EM - >查询新EM
    • 对象A>查询>错误,已经关闭,因为已经在第1步获得了它。

    我该怎么办才能快速插入?我需要通过实体来完成,我不打算进行平面DQL / SQL查询。

1 个答案:

答案 0 :(得分:0)

如何在持久化之前找到唯一的哈希?

do {
    $unique_hash = md5(microtime()); // Work out your hash here.
    $existing = $repository->findOneByHash($unique_hash);
    if (!$existing) {
        break; // else carry on until we get one.
    }
} while (1);

// Use your unique hash here.