在Doctrine ORM中实现"如果存在则更新"

sea*_*ans 24 php sql orm doctrine

我想INSERT OR UPDATE IF EXISTS在一次交易中.

mysql中,我通常会使用DUPLICATE KEY("UPDATE ON DUPLICATE KEY".)我知道使用各种SQL变体和子查询解决这个问题很多,但我正在尝试在Doctrine(PHP ORM)中实现它.似乎会有Doctrine方法来做这个,因为它是如此功能丰富,但我找不到任何东西.出于某种原因,使用PHP ORM包这是一个问题吗?或者,任何Doctrine专家都知道如何通过黑客或任何方式实现这一目标?

ken*_*ken 5

我唯一能想到的是首先查询实体是否存在,否则创建新实体.

if(!$entity = Doctrine::getTable('Foo')->find(/*[insert id]*/))
{
   $entity = new Foo();
}
/*do logic here*/
$entity->save();
Run Code Online (Sandbox Code Playgroud)

  • 没有什么可以确保在查询和保存之间不创建行. (16认同)
  • 这不是交易的目的吗? (6认同)

Bjö*_*tau 5

根据https://www.vivait.co.uk/labs/updating-entities-when-an-insert-has-a-duplicate-key-in-doctrine的说明,可以使用来实现$entityManager->merge()

$entity = new Table();
$entity->setId(1);
$entity->setValue('TEST');

$entityManager->merge($entity);
$entityManager->flush();
Run Code Online (Sandbox Code Playgroud)


pix*_*x0r 3

学说支持REPLACE INTO使用该replace()方法。这应该与ON DUPLICATE KEY UPDATE您正在寻找的完全一样。

文档:替换记录

  • REPLACE 的唯一问题似乎是它删除然后创建一个新行(而不是执行实际的 UPDATE),从而删除自动增量 id(在本例中是我的主 id)。我在这里错过了什么吗?例如 - 我的自动增量 id 是 9,但计数为 3000。当我对第 9 行执行 REPLACE INTO 时,新行 id 是 3001。 (10认同)
  • `REPLACE INTO` 不等于 `INSERT ... ON DUPLICATE KEY UPDATE ...`。第一个将删除该行并插入一个新行。如果存在删除触发器或外键(使用“CASCADE”更是如此),“REPLACE”不是一个可行的选择。 (5认同)