【问题标题】:"REPLACE" kind of persisting with Doctrine2 EntityManagerDoctrine2 EntityManager 的“REPLACE”类坚持
【发布时间】:2014-01-25 04:54:27
【问题描述】:

我有一个实体,如果它不存在,我需要保留它,如果它存在,我需要更新/替换。

我不想使用->findBy() 查找并执行更新或新操作。

使用 Doctrine1,您可以简单地创建一个新实体并使用方法 ->replace(); 而不是 ->save();。我有点需要使用 EntityManager 的 Doctrine2 的这种行为。

<?php
$user = new User;
$user->setName('Mr.Right');
$em->persist($user);
$em->flush();

来自http://docs.doctrine-project.org/en/latest/reference/working-with-objects.html#persisting-entities

如果 X 是一个预先存在的托管实体,它会被持久化忽略 操作。

我需要替换/更新而不是忽略预先存在的托管实体, 有人知道吗?

【问题讨论】:

  • 你找到答案了吗?
  • @PavelDubinin 不,但老实说,我很久以前就放弃寻找解决方案了

标签: php doctrine-orm entitymanager


【解决方案1】:

如果不执行原始查询,我不确定是否可行。但是你为什么不想先查一下呢?我会使用以下内容:

$user = $em->find('User', $id);
if (!$user) {
    $user = new User;
    $em->persist($user);
}
$user->setName('Mr.Right');
$em->flush();

【讨论】:

  • 这是我的 atm 但如果你有 200k 实体,使用 200k xa 单个 REPLACE 而不是 200k x SELECT + if + UPDATE/@ 会快一点987654327@
  • 不支持替换的原因(不再支持?)可能是因为并非所有平台都支持它。使用原始查询进行批处理或查看docs.doctrine-project.org/en/latest/reference/…
  • 嗯好吧..会做更多的研究或简单地使用find。 +1 感谢您的努力和帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-01
  • 1970-01-01
  • 2011-11-01
  • 2014-10-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多