REPLACE сохраняется с помощью Doctrine2 EntityManager

У меня есть сущность, которую мне нужно сохранить, если она не существует, и обновить/заменить, если она существует.

Я не хочу искать с помощью ->findBy() и выполнять обновление или новые операции.

С Doctrine1 вы можете просто создать новую сущность и использовать метод ->replace(); вместо ->save();. Мне нужно такое поведение для Doctrine2 с использованием EntityManager.

<?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 является ранее существовавшим управляемым объектом, операция сохранения игнорирует его.

Мне нужно, чтобы существующие управляемые объекты были заменены/обновлены, а не проигнорированы, кто-нибудь знает?


person Daniel W.    schedule 07.01.2014    source источник
comment
Вы когда-нибудь находили ответ на это?   -  person Pavel Dubinin    schedule 02.09.2016
comment
@PavelDubinin нет, но, честно говоря, я давно перестал искать решение   -  person Daniel W.    schedule 02.09.2016


Ответы (1)


Я не уверен, что это возможно без выполнения необработанного запроса. Но почему бы тебе не посмотреть сначала? Я бы использовал следующее:

$user = $em->find('User', $id);
if (!$user) {
    $user = new User;
    $em->persist($user);
}
$user->setName('Mr.Right');
$em->flush();
person sroes    schedule 07.01.2014
comment
Это то, что у меня есть в банкомате, но если у вас 200 тыс. сущностей, немного быстрее использовать 200 тыс. x один REPLACE вместо 200 тыс. x SELECT + if + UPDATE/INSERT - person Daniel W.; 07.01.2014
comment
Причина, по которой замена не поддерживается (больше?), Вероятно, заключается в том, что ее поддерживают не все платформы. Либо используйте необработанный запрос для пакетной обработки, либо просмотрите документы. .doctrine-project.org/en/latest/reference/ - person sroes; 07.01.2014
comment
хм, ладно .. проведу еще несколько исследований или просто использую find. +1 за ваши усилия и помощь, спасибо! - person Daniel W.; 07.01.2014