2013-07-30 53 views
1

使用Symfony2/doctrine2,虽然我们使用find()函数根据所选实体获取特定对象,如果存在关系(如OneToMany),Doctrine会返回所有其他对象。避免原则返回所有实体

例如:(存储,分类,...等)

$em = $this->get(
     'doctrine.orm.entity_manager', 
      $request->getSession()->get('entity_manager') 
); 
$product = $em->getRepository('MyBundle:Product')->find($id); 

在$产品中的结果将是Product对象+像其他链接对象

我们如何控制学说确定我们需要返回哪个对象。

我可以使用Querybuilder,但我看是否有任何功能都确定。

回答

5

主义回报所有其他对象

这不是它是如何工作的,至少在默认情况下。

学说使用了所谓的lazy loading
从官方文档,你有下面的例子:

<?php 
/** @Entity */ 
class Article 
{ 
    /** @Id @Column(type="integer") @GeneratedValue */ 
    private $id; 

    /** @Column(type="string") */ 
    private $headline; 

    /** @ManyToOne(targetEntity="User") */ 
    private $author; 

    /** @OneToMany(targetEntity="Comment", mappedBy="article") */ 
    private $comments; 

    public function __construct { 
     $this->comments = new ArrayCollection(); 
    } 

    public function getAuthor() { return $this->author; } 
    public function getComments() { return $this->comments; } 
} 

$article = $em->find('Article', 1); 

而且下面的解释:

而不是通过你回一个真正的作者实例和 意见收集学说将创建代理实例为你。只有当你 第一次访问这些代理时,他们将通过 EntityManager并从数据库加载它们的状态。

参考:有关的话题http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/working-with-objects.html#entity-object-graph-traversal

的更多信息:http://www.doctrine-project.org/blog/doctrine-lazy-loading.html

+2

呵呵我们在这里有同样的想法:) – nifr

3

您可以配置extra lazy associations避免一般关系的负荷。

/** 
* @ManyToMany(targetEntity="CmsUser", mappedBy="groups", fetch="EXTRA_LAZY") 
*/ 
protected $property; 
相关问题