2016-11-18 10 views
3

私は、Doctrineリポジトリをsymfony2のサービスとして渡し、EntityManagerを渡さないという一般的な考え方が好きです。しかし、データを読むときは問題ありませんが、ここではセービングロジックが少し問題になります。 http://php-and-symfony.matthiasnoback.nl/2014/05/inject-a-repository-instead-of-an-entity-manager/が、変更は持続分離でフラッシング:Doctrine:1つのクラスのエンティティだけをフラッシュできますか?

はのは、リファレンスとしてこれを見てみましょう

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

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

問題は、特定のリポジトリ内のflushすべてのエンティティ内のすべての変更です。

エンティティのクラスを1つだけフラッシュすることはできますか? (おそらく依存エンティティにカスケード)ので、私は基本的に何かのように行うことができます:私のようなものと考え

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

$this->customerRepository->flush(); 

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

をしかし、それは動作しませんので、私は、何かを誤解している必要があります。

編集:はい、私は$this->_em->flush($entity)を行うことができますが、これを1つずつ実行することは最適ではありません。私は$this->_em->flush($arrayOfEntities)を行うことができることを知っていますが、 "foreach"の例をこのように動作させるには、リポジトリ内のすべての永続エンティティをDoctrineの内部構造を複製する必要があります。

+1

ハズレからスタート。実際、あなたはその理由を暗示しました。エンティティは他のエンティティとの関係を持つ傾向があります。この種の分離が本当に必要な場合は、複数のエンティティマネージャを使用してください。しかし実際には、エンティティマネージャをフラッシュして問題になることはありませんでした。 – Cerad

答えて

1

あなたは一例として、あなたはエンティティリポジトリのフラッシュ方法に固執するエンティティのインスタンスを渡すために試みることができる:

Doctrine/ORM/EntityManagerクラスのドキュメント方法 flushのよる

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

* 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) 

・ホープ、このヘルプ

+0

エンティティを1つずつフラッシュしたくないので、Doctrineが行うすべての最適化をこの方法で緩和します。私はむしろ1つのクラスのすべての永続化されたエンティティを1回のフラッシュでフラッシュするでしょう。 – Kalmar

7

はこれを試してみてください:

$em->flush($entity); 

次に、doctrineは$ entityをフラッシュし、他のものは無視します。

0

短い答え:はい。

長い答え:すべての読み込まれたエンティティをループし、そのクラスをチェックし、必要なクラスがあればエンティティをフラッシュする必要があります。

を参照してください\ ORM \ EntityManagerのflush() function

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

\ORM\UnitOfWorkクラスを使用すると、使用できるいくつかの機能があり、commit() function

関連する問題