0

次のフィールドを持つCategoryというエンティティがあります。

id: integer
name: string
slug: string
children: OneToMany(targetEntity="Category", mappedBy="parent")
parent: ManyToOne(targetEntity="Category", inversedBy="children")

ご覧のとおり、各カテゴリは別の子/親になることができます。

すべてのカテゴリを配列にマップする必要があるため、それらをすべてまとめてロードするのが最善であると考えました。

$categoryRepository->findAll();

後で、マッピング メソッドで、各カテゴリの子を取得したいので、使用します

$category->getChildren();

最初にすべてのカテゴリをロードしたため、実行されるクエリは 1 つだけだと思いましたが、プロファイラーの表示が異なります。すべてのレコードをフェッチするクエリ1 つあります(プロファイラーからの出力)。

SELECT t0.id AS id1, t0.name AS name2, t0.slug AS slug3, t0.parent_id AS parent_id4
FROM acme_category t0

そして、すべてのレコードに対して別のクエリがあります。

SELECT t0.id AS id1, t0.name AS name2, t0.slug AS slug3, t0.parent_id AS parent_id4
FROM omnt_work_category t0 WHERE t0.parent_id = 1

SELECT t0.id AS id1, t0.name AS name2, t0.slug AS slug3, t0.parent_id AS parent_id4
FROM omnt_work_category t0 WHERE t0.parent_id = 1

etc..

何故ですか?最初からすべてのレコードをロードするにはどうすればよいですか?

ありがとう!

4

1 に答える 1

0

リレーション アノテーションで fetch="EAGER" を宣言することで、自動的にロードすることができます。

ただし、実装を見ると、子/親の関係を維持してデータの階層を作成しようとしているように見えます。これには、ネストされた set ソリューションを実装する方がよい場合があります。これを処理できるDoctrine 2用のライブラリがいくつかあります。

私が使用してお勧めするものは >> https://github.com/blt04/doctrine2-nestedset

Doctrine がキャッシュを検索する代わりに、同じレコードを複数回取得しようとしていることは確かに興味深いことです。おそらく、リレーショナル アイテムのキャッシングの処理が少し異なるのでしょう。確かに調査する価値があるでしょう。

于 2012-05-28T10:34:47.603 に答える