2016-11-18 2 views
3

Ich mag die allgemeine Idee, Doctrine-Repositories als Dienste in Symfony2 zu übergeben und die Weitergabe von EntityManager zu vermeiden. Während es beim Lesen von Daten in Ordnung ist, wird die Speicherlogik hier jedoch etwas problematisch.Lehre: Kann ich nur eine Klasse von Entitäten spülen?

ist dies als Referenz nehmen lassen: http://php-and-symfony.matthiasnoback.nl/2014/05/inject-a-repository-instead-of-an-entity-manager/, aber mit einer Änderung Trennung persistierenden und Spülung:

class DoctrineORMCustomerRepository extends EntityRepository implements CustomerRepository 
{ 
    public function persist(Customer $customer) 
    { 
     $this->_em->persist($customer); 
    } 

    public function flush() 
    { 
     $this->_em->flush(); 
    } 
} 

Das Problem, das Sie in einem bestimmten Repository in allen Unternehmen alle Änderungen bündig ist.

Jetzt ist es möglich, nur eine Klasse von Entitäten zu spülen? (Cascading möglicherweise zu unselbständigen Einheiten), so konnte ich im Grunde so etwas wie:

foreach ($customers as $customer) { 
    $this->customerRepository->persist($customer); 
} 

$this->customerRepository->flush(); 

ich als so etwas wie:

$this->_em->flush(getUnitOfWork()->getIdentityMap()[$this->_entityName]); 

Aber ich muss etwas falsch verstanden haben, weil es nicht funktioniert.

EDIT: Ja, ich weiß, ich kann $this->_em->flush($entity) tun, aber dies eins nach dem anderen ist suboptimal. Ich weiß sogar, dass ich $this->_em->flush($arrayOfEntities) tun kann, aber um das "foreach" -Beispiel auf diese Weise funktionieren zu lassen, müsste ich alle persistierenden Entitäten im Repository verfolgen, die einige Doctrine-Interna duplizieren.

+1

Nope starten. Tatsächlich hast du den Grund angedeutet. Entitäten neigen dazu, Beziehungen zu anderen Entitäten zu unterhalten. Wenn Sie diese Art von Isolation wirklich benötigen, verwenden Sie mehrere Entity Manager. Aber in der Praxis habe ich nie gefunden, dass der Entity Manager ein Problem darstellt. – Cerad

Antwort

1

Sie könnten versuchen, die Entitätsinstanz Sie auf die Flush-Methode des Unternehmens-Repository anhalten wollen passieren, als Beispiel:

$this->_em->flush($entity); 

Nach der doc der Doctrine/ORM/EntityManager Klasse die Methode flush:

* If an entity is explicitly passed to this method only this entity and 
* the cascade-persist semantics + scheduled inserts/removals are synchronized. 
* 
* @param null|object|array $entity 
* 
* @return void 
* 
* @throws \Doctrine\ORM\OptimisticLockException If a version check on an entity that 
*   makes use of optimistic locking fails. 
* @throws ORMException 
*/ 
public function flush($entity = null) 

Hope this Hilfe

+0

Ich möchte keine Entitäten einzeln löschen, ich würde damit alle möglichen Optimierungen verlieren, die Doctrine macht. Ich würde lieber alle persistenten Entitäten einer Klasse in einem einzigen Flush löschen. – Kalmar

7

Try this:

$em->flush($entity); 

Dann wird die Doktrin nur $ Entity spülen, andere ignorieren.

0

Kurze Antwort: ja.

Lange Antwort: Sie müssen alle geladenen Entitäten durchlaufen, überprüfen Sie ihre Klasse und flush die Entität, wenn Klasse Sie benötigt.

See \ ORM \ EntityManager flush() function:

$this->unitOfWork->commit($entity); 

\ORM\UnitOfWork Klasse einige Funktionen, die Sie verwenden können, von commit() function

Verwandte Themen