2012-01-10 111 views
0

我有两个实体用户和配置文件具有一对一的关系。在使用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(); 

当我检查Symfony的探查查询的数量,我可以看到ň触发档案表中用户表ñ用户的查询号码。有什么方法可以停止查询配置文件表。

请让我知道是否有更好的实施方式。

在此先感谢

新增实体类

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

能!你发布你的用户实体的内容?因为据我所知可以从手册http://www.doctrine-project.org/docs/orm/2.0/en/reference/dql-doctrine-query-language.html这应该除非你通过指定两个实体来进行取数连接,否则你会使用MySQL吗?考虑启用mysql general-log en,查看使用tail -f/var/log/mysql/mysql发送到服务器的内容。 log(example)。祝你好运 – 2012-01-10 08:12:12

+0

Hi Kees Schepers,谢谢你的回应,我有将我的实体类结构添加到问题中,并从我之前添加的查询代码中,您可以知道我没有进行任何连接,即使我加入配置文件表,只有查询才能获取用户会受到连接的影响,而且仍然是个人查询获取配置文件存在。 – Nizam 2012-01-10 09:10:01

+0

你能否也发布确切的查询主义发送到您的服务器?从通用日志?你能尝试一种单向关系吗? http://www.doctrine-project.org/docs/orm/2.0/en/reference/association-mapping.html#one-to-one-unidirectional – 2012-01-10 09:14:25

回答

0

你的答案就在这里!

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

“在实体之间很多情况下,协会可以得到相当大的。即使是在像一个博客。在那里的帖子可以被注释掉一个简单的场景,你总是要假设后得出的意见hundrets。在Doctrine 2.0如果你访问了一个关联,它总会被完全加载到内存中,如果你的关联包含几个hundrets或者数千个实体,那么这会导致非常严重的性能问题。用于关联。默认情况下关联标记为Lazy,这意味着关联的整个集合对象在它第一次访问时被填充。如果选中一个关联作为额外懒集合下面的方法可以称为不触发集合的满负荷:”

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

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

这是一个有点晚,但它可能会帮助别人那里

+0

嗨thingygeoff,谢谢你的答案,但额外懒惰关键字只适用于多对多的关系 – Nizam 2012-10-03 09:19:22