User
に関連するoneToMany
の関係を持つParent
のエンティティを持っています。Doctrine:1つの要素が必要なときに遅延コレクションの全体コレクションを防止する
Child
Parent
のコレクションは、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
クラスで処理してください。
私はDoctrineを覚えていませんが、あなたのアプローチが良くない、SQLを考え、次にORMを考えて最適化すると、parent = userの子を数えなければなりません – amdev
@amdev ORMの目的は完全に正反対です。最初にオブジェクトを考える。それでは何か。 –
私は間違いました、ormは強力ですが、SQLが何の裏に生成されているのか理解しておかなければなりません。 ChildDao.findChildByParent($ parent、$ user)のような何らかのDAOは、存在する場合は子オブジェクトを返し、存在しない場合はnullを返します。疑いなくあなたはここでSQLのクエリを操作することは決してそれは基本的な操作です。しかし、あなたがあなたの子供が見つかるまで、あなたがあなたの方法を親子 - >子供(ユーザー)にとどめて、すべてのコレクションをforeachすることを望むなら、それはパフォーマンスが失われます。 – amdev