2011-07-19 14 views
0

私は現在Symfony2とDoctrine2に最近のsymfony 1.4アプリケーションを移植しています。私がマッピング情報を変換すると(私たちはYAMLファイルを使用する)、最初に気がついたことは、ユーザオブジェクトのクエリが無限ループに入ったことです。 私は団体と遊んで、私は周期的なものを持っていることがわかりました。私はデバッグの目的でそれを削除し、なぜそれらがすべての関連付けを一巡するのか疑問に思っていました。私はちょうどすべてのユーザーを求めていました。Doctrine2のデフォルトとして遅延読み込みを設定するには?

今日私は別のオブジェクトで同じ問題を再現しましたが、930のクエリの後で停止し、無限ループはありませんでした。 Doctrine2は、オブジェクトを生成するときに、各関連のすべてのオブジェクトを照会しているようです。プロキシも、遅延ロードもありません。

fetch: LAZYをそのアサーションとボイルアで有効にすると、自動母集団は停止しました。 しかし、モデルには50を超える関連があり、この行をすべてに追加する必要はないので、これをデフォルトの動作として使用したいと思います。

Doctrine 2のデフォルトとしてレイジーローディングをアクティブにするにはどうすればよいですか?

答えて

0

モデルを最小限に抑えて、Doctrineがこれらの複数の行をすべてフェッチする理由を知りました。

原因は私が使用しているORMツールでした。既存のデータベース構造をインポートすると、すべての関係は「1対1」の関係とみなされました。 85個のすべての団体で「1対多」の関係を変更する(正しいと思われる) を行う必要があります。

0

これは実際にどのように遅延ロードが機能するかです。関連するオブジェクトを取得しようとすると、Doctrineは自動的に別のクエリを発行します。特に、エンティティとその関連オブジェクトのリストを表示しているときには、遅延読み込みを使用することをお勧めします。それが960の質問を持っている理由です!それでも、Doctrineはデフォルトでは怠惰ですが、関連するエンティティをクエリに参加させて取得すると、そのクエリは単一のクエリになります。

$blogs = $em->createQuery('SELECT b, p FROM Blog b JOIN b.posts p')->getResult(); 

の例では、上記SELECT b, p FROM Blog bに似ていますが、記事にアクセスしますときDoctrineはもはや別のクエリを発行しません。

+0

実際には、問題の一部である可能性がありますが、私は決して関連オブジェクトにアクセスしていません。あなたの例では、私はブログを繰り返して、ブログのタイトルをエコーし​​ます。しかし、Doctrine(またはSymfony)では、各ブログのすべての投稿に1つのクエリが入力されます。 私の一部にいくつかの設定があると、各オブジェクトを不必要に完全に埋めるための水分調整プロセスが発生したと思われます。 – Yeti

+0

モデル内の循環参照はそれと関係しているようです。私は現在、最小限の例を編集中です。 – Yeti

+0

ブログ – ken

関連する問題