使用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上的结果将是Product对象+其他链接对象,如(Store,Category,...等)
我们如何控制学说来确定我们需要返回哪个对象。
我可以使用Querybuilder,但我正在查看是否有任何函数都是确定的。
答案 0 :(得分:5)
Doctrine返回所有其他对象
这不是它的工作原理,至少在默认情况下是这样。
Doctrine使用所谓的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);
以下解释:
而不是传回一个真正的作者实例和一个集合 注释Doctrine将为您创建代理实例。只有你 他们第一次访问这些代理时会访问这些代理 EntityManager并从数据库加载它们的状态。
有关该主题的更多信息:http://www.doctrine-project.org/blog/doctrine-lazy-loading.html
答案 1 :(得分:3)
您可以配置extra lazy associations以避免加载关系。
/**
* @ManyToMany(targetEntity="CmsUser", mappedBy="groups", fetch="EXTRA_LAZY")
*/
protected $property;