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 上的结果将是 Product 对象 + 其他链接对象,例如(商店、类别等)

我们如何控制教义来确定我们需要归还哪个对象。

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

4

2 回答 2

5

教义返回所有其他对象

这不是它的工作方式,至少在默认情况下是这样。

Doctrine 使用所谓的延迟加载
从官方文档中,您有以下示例:

<?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 不会将真实的 Author 实例和评论集合传回给您,而是会为您创建代理实例。只有当您第一次访问这些代理时,它们才会通过 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

于 2013-07-30T19:06:12.527 回答
3

您可以配置额外的惰性关联以避免加载关系。

/**
 * @ManyToMany(targetEntity="CmsUser", mappedBy="groups", fetch="EXTRA_LAZY")
 */
protected $property;
于 2013-07-30T19:07:52.060 回答