2014-01-07 2 views
1

У меня есть объект, который мне нужно сохранить, если он не существует и обновить/заменить, если он существует.«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 является существовавшим ранее управляемым объектом, он игнорируется сохраняются операции.

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

+0

Вы когда-нибудь находили ответ на этот вопрос? –

+0

@PavelDubinin nope, но, честно говоря, я оставил поиск решения давно – DanFromGermany

ответ

2

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

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

Это то, что у меня есть atm, но если у вас есть 200k сущностей, немного быстрее использовать 200k xa вместо 'REPLACE' вместо 200k x' SELECT' + 'if' +' UPDATE'/'INSERT' – DanFromGermany

+0

Причина замены не поддерживается (больше?), вероятно, потому, что не все платформы поддерживают ее. Либо используйте необработанный запрос для пакетной обработки, либо посмотрите на http://docs.doctrine-project.org/en/latest/reference/batch-processing.html – sroes

+0

hmm okay .. будет делать еще несколько повторных попыток или просто использовать 'find'. +1 за ваши усилия и помощь, спасибо! – DanFromGermany

Смежные вопросы