Doctrine2 — лучший способ получить два разных объекта одного и того же объекта

Я работаю над инструментом для параллелизма с Doctrine 2.

Я сталкиваюсь с проблемой «лучшей практики» для извлечения нового экземпляра сущности без кеша (идея после этого состоит в том, чтобы иметь возможность сравнивать некоторые свойства из двух разных объектов одной и той же сущности и возвращать различия)

Некоторый код может помочь (+ документ: (http://doctrine-orm.readthedocs.org/projects/doctrine-orm/en/latest/reference/transactions-and-concurrency.html)):

// This is my current implementation.

$entity = $em->find(1);
$entity->setName('TEST');
// This entity as a "version" field equal to 2 in DB for example

try {
$em->lock($entity, LockMode::OPTIMISTIC, 1); // Will throw an OptimisticLockException
} catch(OptimisticLockException $e) {
$em->detach($entity);

$dbEntity = $this->find($entity->getId());

$em->detach($dbEntity);

$entity = $em->merge($entity);

var_dump($entity->getName()); // TEST
var_dump($dbEntity->getName()); // The old value

... do more stuff, like comparing the two objects ...
}

Является ли использование методов detach + merge хорошей практикой для такого поведения? Любая лучшая идея, чтобы улучшить этот код?


Изменить 1:

На самом деле, после добавления некоторых тестов, метод «слияния» — это не то, что я ожидал: объект не «повторно присоединяется» к единице работы.

Такое поведение не то, что я хочу, потому что разработчик не может вносить изменения + сбросить свою сущность после использования моего инструмента.


Изменить 2:

После того, как я покопался в документации и исходном коде, метод «слияния» — это то, что я и хотел: присоединен новый экземпляр объекта, а не тот, который я предоставил ($ entity в моем примере).

Поскольку этот код (в моем инструменте) находится в методе, целью которого является возвращение объекта $ dbEntity моего объекта $ entity, передавая ссылку на $ entity (&$ entity) решить мою проблему «Edit 1».

3

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]