2016-08-25 9 views
0

Userに関連するoneToManyの関係を持つParentのエンティティを持っています。Doctrine:1つの要素が必要なときに遅延コレクションの全体コレクションを防止する

ChildParentのコレクションは、user_idでインデックスされています。つまり、indexByマッピングオプションを使用しています。

Entity\Parent: 
    type: entity 
    oneToMany: 
    children: 
     targetEntity: Entity\Child 
     mappedBy: parent 
     indexBy: user_id 
     cascade: [ persist ] 

さて、Parentに私は、そのコレクション内の特定のUserためChildがあれば教えてしまう方法をしたいと思います。これを行うには、Parentに次のコードがあります。

class Parent { 
    public function hasChild(User $user) { 
     return isset($this->children[$user->getId()]); 
    } 
} 

これは期待どおりに動作します。

しかし、このアプローチではパフォーマンスの問題があります。 Parent::childrenにアクセスすると、Doctrineは全体のコレクションをロードします。これは数千にもなりますが、Childインスタンスです。

コレクション全体をロードせずに確認する方法はありますか?を現在のインターフェイスに維持しますか? Childのリポジトリではなく、Parentクラスで処理してください。

+0

私はDoctrineを覚えていませんが、あなたのアプローチが良くない、SQLを考え、次にORMを考えて最適化すると、parent = userの子を数えなければなりません – amdev

+0

@amdev ORMの目的は完全に正反対です。最初にオブジェクトを考える。それでは何か。 –

+0

私は間違いました、ormは強力ですが、SQLが何の裏に生成されているのか理解しておかなければなりません。 ChildDao.findChildByParent($ parent、$ user)のような何らかのDAOは、存在する場合は子オブジェクトを返し、存在しない場合はnullを返します。疑いなくあなたはここでSQLのクエリを操作することは決してそれは基本的な操作です。しかし、あなたがあなたの子供が見つかるまで、あなたがあなたの方法を親子 - >子供(ユーザー)にとどめて、すべてのコレクションをforeachすることを望むなら、それはパフォーマンスが失われます。 – amdev

答えて

2

Extra Lazy Associationsを見ましたか?

バージョン2.1の新機能。

多くの場合、エンティティ間の関連付けはかなり大きくなる可能性があります。ブログのようなシンプルなシナリオでも。投稿をコメントすることができる場所では、投稿が何百ものコメントを描画すると常に仮定しなければなりません。 Doctrine 2.0では、アソシエーションにアクセスすると、常にメモリに完全にロードされます。これは、あなたの団体に数百または数千のエンティティが含まれている場合、かなり重大なパフォーマンス上の問題につながります。

Doctrine 2.1では、関連のためにExtra Lazyという機能が導入されています。アソシエーションはデフォルトでLazyとしてマークされます。つまり、アソシエーションのコレクションオブジェクト全体は、初めてアクセスされたときに移入されます。あなたは余分な怠惰との関連をマークすると、コレクションの次のメソッドは、コレクションの全負荷をトリガーせずに呼び出すことができます。

  • Collection#contains($entity)
  • Collection#containsKey($key) (available with Doctrine 2.5)
  • Collection#count()
  • Collection#get($key) (available with Doctrine 2.4)
  • Collection#slice($offset, $length = null)
+0

ありがとう、あなたは一般的に正しいです。残念ながら、 'indexBy'が外部キー(' user'の代わりに 'user_id'のようなカラム名を使用する必要がある)である場合、余分なレイジーフェッチに問題があるようですが、それはこの質問の範囲外です。 –

関連する問題