4

膨大なコレクション(10,000を超えるオブジェクト)に大きなSymfony2フォームがあります。単純な理由で、何千ものオブジェクトのフォームを表示することはできません。約300個のオブジェクトのフォームを表示しています。

コレクションをフォームにフィルタリングする方法が見つからないため、次のようにします。

    $bigSetOfObjects = array(
        'myObject' => $this
                ->getDoctrine()
                ->getRepository('MyObject')
                ->findBy(... )
    );

    $form = $this->createForm(new MyObjectForm(), $bigSetOfObjects);

    // And a little further
    if ($this->getRequest()->getMethod() == 'POST') {
        $form->bindRequest($this->getRequest());
        $this->getDoctrine()->getEntityManager()->flush();
    }           

すべてがうまく機能します。フォームは正しい値で表示され、更新も正常に機能します。データはデータベースに正しく保存されます。問題は、Doctrineがオブジェクトごとに単一の更新ステートメントを実行していることです。つまり、ページ全体が約300のSQLステートメントであり、パフォーマンスの問題が発生します。

私が理解していないのは、フォームのすべてではなく、いくつかの値のみを更新しているということです。では、なぜDoctrineは更新されたオブジェクトを検出できず、データベース内のそれらのオブジェクトのみを更新できないのでしょうか。

私が間違っていることはありますか?忘れたの?

4

1 に答える 1

7

デフォルトでは、Doctrineはプロパティごとに管理対象オブジェクトへの変更を検出します。プロパティが変更されていない場合は、そのプロパティの更新クエリを実行してはなりません。フォームが誤って何かを変更していないことを確認することをお勧めします。

ただし、追跡ポリシーを変更することで、オブジェクトが変更されたとDoctrineが判断する方法を変更できます。多くのオブジェクトを操作しているため、DEFERRED_EXPLICIT追跡ポリシーに変更することをお勧めします。このメソッドでは、具体的に次のように呼び出します。

$em->persist($object);

更新するエンティティ。オブジェクトを永続化する必要があるかどうかを判断するには、独自のロジックを実装する必要があります。

于 2012-07-02T16:29:20.290 に答える