реализует «обновление, если существует» в Doctrine ORM - PullRequest
23 голосов
/ 15 июля 2009

Я пытаюсь INSERT OR UPDATE IF EXISTS в одной транзакции.

в mysql , я обычно использовал бы DUPLICATE KEY («ОБНОВЛЕНИЕ НА ДУБЛИКАТИВНОМ КЛЮЧЕ».) Мне известно о многих решениях этой проблемы с использованием различных вариантов SQL и подзапросов, но я Я пытаюсь реализовать это в доктрине (PHP ORM). Похоже, что для этого есть методы Doctrine, потому что это так много возможностей, но я ничего не нашел. Является ли такая проблема проблемой с использованием пакетов PHP ORM по какой-то причине? Или кто-нибудь из экспертов Doctrine знает, как этого добиться с помощью хаков или каких-либо средств?

Ответы [ 4 ]

5 голосов
/ 20 октября 2009

Единственное, о чем я могу думать, это сначала запросить сущность, если она существует, иначе создайте новую сущность.

if(!$entity = Doctrine::getTable('Foo')->find(/*[insert id]*/))
{
   $entity = new Foo();
}
/*do logic here*/
$entity->save();
4 голосов
/ 11 октября 2017

Согласно 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();
3 голосов
/ 15 июля 2009

Doctrine поддерживает REPLACE INTO с использованием метода replace(). Это должно работать точно так же, как ON DUPLICATE KEY UPDATE, который вы искали.

Документы: Замена записей

0 голосов
/ 18 ноября 2018

Я думаю, что лучший способ - это вызвать entityManager-> merge ($ entity); Потому что это самая близкая вещь для обновления, если существует операция, как обещано в документации: https://www.doctrine -project.org / projects / doctrine-orm / en / 2.6 / reference / working-with-objects.html

...