2012-01-10 1 views
0

1対1の関係を持つ2つのエンティティUserとProfileがあります。私はsymfonyのプロファイラでのクエリの数を確認するとQueryBuilderを使用してdoctrine2で照会する関連エンティティを停止します。

$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(); 

私は見ることができましたのnクエリの数は、ユーザーテーブルののnユーザーのプロファイルテーブルでトリガ。プロファイルテーブルのクエリを停止できる方法はありますか?

これを実装する方法があるかどうか教えてください。事前に

おかげ

を追加しましたエンティティークラス

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 [email protected] 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 
+0

!あなたはあなたのUserエンティティの内容を投稿しますか?これまでのところ、マニュアルhttp://www.doctrine-project.org/docs/orm/2.0/en/reference/dql-doctrine-query-language.htmlから理解できるはずですMySQLを使用していますか?tail -f/var/log/mysql/mysqlを使ってmysql general-logを正確にサーバに送信することを検討してください。ログ(例)。幸運 –

+0

こんにちはKees Schepers、ありがとう、私は持っている私のエンティティクラス構造を質問に追加し、以前に追加したクエリコードから、私がプロファイルテーブルに参加しても、参加をしていないことを知ることができます。プロファイルを取得するためのクエリが存在します。 – Nizam

+0

Doctrineがサーバーに送信する正確なクエリを投稿することもできますか?一般的なログから?あなたは単方向関係も試してみませんか? http://www.doctrine-project.org/docs/orm/2.0/ja/reference/association-mapping.html#one-to-one-unidirectional –

答えて

0

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

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

「多くのケースでは、エンティティ間の関連がかなり大きくなる可能性があります。でも、ポストをコメントすることができますブログ。のような単純なシナリオでは、あなたは常にポストはコメントのhundretsを描くことを前提としなければならないが。でDoctrine 2.0の場合、アソシエーションにアクセスすると、常にメモリに完全にロードされます。これにより、アソシエーションに数千のエンティティが含まれる場合、パフォーマンス上の問題がかなり深刻化する可能性があります。

Doctrine 2.1では、アソシエーションはデフォルトでLazyとしてマークされます。これはアソシエーションのコレクションオブジェクト全体を意味します最初にアクセスされたときに読み込まれます。あなたは、コレクションの次のメソッドは、コレクションの全負荷をトリガーせずに呼び出すことができます怠惰などの追加の関連をマークした場合:」

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

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

ことができますそれは少し遅れだが、それはそこに他の人を助けるかもしれない

+0

Hi thingygeoff、答えてくれてありがとうございますが、Extra Lazyキーワードは多対多のリレーションシップのみで動作します – Nizam

関連する問題