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