8

次の関係を持つエンティティShopと関連するエンティティがあります。ShopProduct

/**
 * @ORM\OneToMany(targetEntity="ShopProduct", mappedBy="shopid", fetch="EXTRA_LAZY")
 */
private $products;

小枝のテンプレートで のカウントにアクセスしたいproductsので、アクセスします

{{ entity.getProducts().count }}

しかし、symfony2 プロファイラーを使用してクエリの数と内容を確認すると、 (ドキュメントCOUNTに基づいて) 予想されるのではなく、完全な選択が発行されていることがわかります。

各 に対して完全な選択を発行するShopと、メモリ使用量が 250Mb 以上になり、ページの読み込み時間が 30 秒以上かかりますが、これは望ましくありません。

を追加した後fetch="EXTRA_LAZY"、教義のキャッシュをクリアしました。

間違ったアプローチを使用したり、ドキュメントを誤解したりして、何かを見落としていますか?

[編集]

doctrine/annotations                v1.1
doctrine/cache                      v1.0
doctrine/collections                v1.1
doctrine/common                     2.4.0-RC1
doctrine/data-fixtures              dev-master eef10f6
doctrine/dbal                       2.3.3
doctrine/doctrine-bundle            v1.2.0-beta1
doctrine/doctrine-fixtures-bundle   dev-master 275540d
doctrine/doctrine-migrations-bundle dev-master 99c0192
doctrine/inflector                  v1.0
doctrine/lexer                      v1.0
doctrine/migrations                 dev-master e1f6efc
doctrine/orm                        2.3.3
4

2 に答える 2

14

同じ問題が発生したばかりで、解決策は非常に簡単でした:

{{ value.getAlerts.count() }}

それ以外の

{{ value.getAlerts.count }}

Twig はcount()、"Extra Lazy Load" を意図した Doctrine メソッドを、すべてのエンティティを愚かにフェッチしてカウントする独自の実装のバリアントでオーバーライドしている必要があります。

これにより、予想されるすべての SELECT * クエリが COUNT(*) に変わりました...

于 2014-05-14T20:22:23.773 に答える