ЗАМЕНЕТЕ вид на запазване с 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
Това е, което имам банкомат, но ако имате 200k обекти, е малко по-бързо да използвате 200k x единичен REPLACE вместо 200k x SELECT + if + UPDATE/INSERT - person Daniel W.; 07.01.2014
comment
Причината замяната да не се поддържа (вече?) вероятно е, защото не всички платформи го поддържат. Или използвайте необработена заявка за групова обработка, или погледнете docs .doctrine-project.org/en/latest/reference/ - person sroes; 07.01.2014
comment
хм добре.. ще направя още малко проучване или просто ще използвам find. +1 за вашите усилия и помощ, благодаря! - person Daniel W.; 07.01.2014