0

1 対 1 の関係を持つ 2 つのエンティティ User と Profile があります。

$qb = $this->getDoctrine()->getEntityManager()->createQueryBuilder();
$qb->add('select', 'u')
   ->add('from', '\Acme\TestBundle\Entity\User u')
   ->add('orderBy', 'u.id DESC');
$query = $qb->getQuery();
$customer = $query->execute();

Symfonyプロファイラーでクエリの数を確認すると、ユーザーテーブルのnユーザーのプロファイルテーブルでトリガーされたクエリの数がn個表示されました。Profile テーブルのクエリを停止する方法はありますか。

より良い実装方法があれば教えてください。

前もって感謝します

追加されたエンティティ クラス

class User
{
    /**
     * @var integer $id
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @var string $email
     *
     * @ORM\Column(name="email", type="string", length=255)
     */
    private $email;

    /**
     * @var Acme\TestBundle\Entity\Profile
     * 
     * @ORM\OneToOne(targetEntity="Acme\TestBundle\Entity\Profile", mappedBy="user")
     */
    private $profile;

}

class Profile
{
    /**
     * @var integer $id
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @var integer $user_id
     *
     * @ORM\Column(name="user_id", type="integer")
     */
    private $user_id;

    /**
     * @var string $user_name
     *
     * @ORM\Column(name="user_name", type="string", length=100)
     */
    private $user_name;

    /**
     * @var Acme\TestBundle\Entity\User
     * 
     * @ORM\OneToOne(targetEntity="Acme\TestBundle\Entity\User", inversedBy="profile")
     * @ORM\JoinColumn(name="user_id", referencedColumnName="id")
     */
    private $user;    

}

mysql ログからの応答

120110 15:14:29    89 Connect   root@localhost on test
           89 Query SET NAMES UTF8
           89 Query SELECT c0_.id AS id0, c0_.email AS email1, c0_.password AS password2, c0_.is_demo_user AS is_demo_user3, c0_.status AS status4, c0_.current_service AS current_service5, c0_.registration_mode AS registration_mode6, c0_.verification_code AS verification_code7, c0_.account_type AS account_type8, c0_.activated_date AS activated_date9, c0_.status_updated_at AS status_updated_at10, c0_.created_at AS created_at11, c0_.updated_at AS updated_at12 FROM user c0_ WHERE c0_.id = 1 ORDER BY c0_.email ASC
           89 Query SELECT t0.id AS id1, t0.user_id AS user_id2, t0.user_name AS user_name3, t0.age AS age4, t0.created_at AS created_at5, t0.updated_at AS updated_at6, t0.user_id AS user_id7 FROM profile t0 WHERE t0.user_id = '1'
           89 Quit  
4

1 に答える 1

0

あなたの答えはここにあります!

http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/tutorials/extra-lazy-associations.html

「多くの場合、エンティティ間の関連付けはかなり大きくなる可能性があります。ブログのような単純なシナリオでも、投稿にコメントを付けることができます。投稿には何百ものコメントが表示されると常に想定する必要があります。Doctrine2.0では、関連付けにアクセスすると、アソシエーションに数百または数千のエンティティが含まれている場合、これはかなり深刻なパフォーマンスの問題につながる可能性があります。

Doctrine 2.1では、アソシエーションにExtraLazyと呼ばれる機能が導入されています。アソシエーションはデフォルトでレイジーとしてマークされています。これは、アソシエーションのコレクションオブジェクト全体が、最初にアクセスされたときに入力されることを意味します。アソシエーションを余分な遅延としてマークすると、コレクションのフルロードをトリガーせずに、コレクションの次のメソッドを呼び出すことができます。」

<?php
namespace Doctrine\Tests\Models\CMS;

/**
 * @Entity
 */
class CmsGroup
{
    /**
     * @ManyToMany(targetEntity="CmsUser", mappedBy="groups", fetch="EXTRA_LAZY")
    */
    public $users;
}

少し遅いですが、他の人の役に立つかもしれません!

于 2012-09-14T09:29:31.037 に答える