Реализация "update if exists" в Doctrine ORM
Я пытаюсь выполнить INSERT OR UPDATE IF EXISTS
в одной транзакции.
в mysql, я обычно использовал бы DUPLICATE KEY
( "ОБНОВЛЕНИЕ НА КЛЮЧЕ DUPLICATE".) Я знаю много решений этой проблемы, используя различные варианты и подзапросы SQL, но я Я пытаюсь реализовать это в Doctrine (PHP ORM). Кажется, что для этого будут методы Doctrine, так как они настолько упакованы, но я ничего не нахожу. Почему-то проблема с использованием пакетов PHP ORM по какой-то причине? Или кто-нибудь из экспертов "Доктрины" знает, как добиться этого через хаки или любые средства?
Ответы
Ответ 1
Единственное, о чем я могу думать, это сначала запросить сущность, если она существует, иначе создайте новую сущность.
if(!$entity = Doctrine::getTable('Foo')->find(/*[insert id]*/))
{
$entity = new Foo();
}
/*do logic here*/
$entity->save();
Ответ 2
Doctrine поддерживает REPLACE INTO
с помощью метода replace()
. Это должно работать точно так же, как ON DUPLICATE KEY UPDATE
, которое вы искали.
Документы: Замена записей
Ответ 3
В соответствии с 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();
Ответ 4
Я думаю, что лучший способ - вызвать entityManager-> merge ($ entity); Потому что это самая близкая вещь для обновления, если существует операция, как обещано в документации: https://www.doctrine-project.org/projects/doctrine-orm/en/2.6/reference/working-with-objects.html
Ответ 5
Может ли решение merge() работать, только если у вас есть первичный ключ? Что делать, если вы пытаетесь сделать это с помощью ограничения уникального ключа, генерирующего нарушение?