2012-07-04 3 views
3

Я использую Doctrine 2 и хотел бы, чтобы этот ORM автоматически flush() EntityManager перед выполнением любого запроса SELECT, чтобы обеспечить постоянство в течение всего времени приложения (это приложение много абстрагируется и не должно знать каких-либо EntityManager, кроме встроенных репозиториев).Как автофлюировать в Доктрине 2?

Есть ли возможность сделать это с помощью Доктрины?

Если нет, то любой стратегии реализовать это легко?

+0

Вид интересного вопроса. Я бы тоже хотел это знать. –

+0

Создайте службу, вызовите службу, создайте запрос. –

ответ

0

Единственное решение, которое я нашел до сих пор, чтобы вручную flush() перед выдачей SELECT запроса в хранилище методов, не должны возвращать устаревшие данные:

class OrderRepository 
{ 
    public function findByUser(User $user) 
    { 
     $this->em->flush(); 

     $query = $this->em->createQuery(...); 

     // ... 
    } 
} 

Таким образом, поток скрыт от служб, которые потребляют репозитории.

0

Зачем вам нужно очищать (записывать изменения) до того, как все выбирает? Возможно ли, что вам требуется последовательность транзакций? т.е. будет ли вставка/обновление зависящей от результатов предыдущего выбора? В этом случае я предложил бы использовать явную транзакцию, например, так:

$em->transactional(function($em) { 
    $entity = $em->find('Entity', 123); 
    if ($entity->getValue() > 2) 
    { 
     $user = new User; 
     $user->setName('George'); 
     $em->persist($user); 
    } 
}); 

Если нет, то я бы предложил придерживаться по умолчанию набора и пусть UnitOfWork складывает и оптимизировать вставки/обновление к концу ваше время выполнения.

+1

На самом деле все наоборот. SELECT должен учитывать объект, модифицированный в памяти. Но этот выбор инкапсулируется в репозиторий, сам вызываемый службой. Служба выполняет очень абстрактную работу и не может (читать: * должен * не) обрабатывать объекты низкого уровня, такие как EntityManager. Hibernate, ORM с открытым исходным кодом Java, который вдохновил Doctrine, имеет автоматическую флеш-активацию по умолчанию, когда транзакция активна. – Benjamin

+0

«SELECT должен принимать во внимание объект, модифицированный в памяти» - снова это звучит так, как будто вам нужна целостность транзакций. Его можно проверить ваш набор изменений и разработать, если есть что-то, что важно для выбора вашего дела. $ Em-> getUnitOfWork() -> computeChangeSets(); $ insertions = $ em-> getUnitOfWork() -> getScheduledEntityInsertions(); Не уверен, что это какая-то помощь. –

+0

«Изменено в памяти», я не имею в виду запланированный для вставки, я имею в виду изменение свойства существующего объекта. В любом случае это не имеет никакого отношения к трансактивной целостности, это связано с тем, что хранилище не возвращает устаревшие данные в моей транзакции. То, что вы предлагаете, более сложно, чем то, что я прошу, и не решает проблему (без обид)! – Benjamin

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