原则2中的查询连接实体


Joining Entities on query in Doctrine 2

我试图在原则2中的一个高级查询中加入两个实体。我正在使用Zend Framework 2.

不幸的是,我很难在我现在所做的事情中找到正面和反面。

这是我在ZF2中得到的:

    我已经建立了一个模块,叫做KryuuCategorizer,我要用它来分类网站上的各种内容。
  • 它附加到一个名为categorize的事件,该事件将获得一个实体类型

分类器有2个实体:

Category
  var id
  var name
  var objects
Object
  var id
  var entityName
  var module
  var entityId
  var category

Category->objects被ManyToOne绑定到Object->category

然后我需要将实体手动绑定到Object->entityId,我认为我应该能够通过在原则2中使用join来做到这一点。但我不确定从哪里开始,或者如何掌握它。我希望有人能让我开始并告诉我正确的方向,我看了学说文档,但比我应该更困惑。

有几种方法可以实现你想要的。

1。添加一个fetch="EAGER到关系定义

要做到这一点,在你的Object的实体定义中添加一个fetch="EAGER"

/** MANY-TO-ONE, OWNING SIDE
 * @var Category
 * @ORM'ManyToOne(targetEntity="Application'Entity'Category", inversedBy="objects", fetch="EAGER")
 * @ORM'JoinColumn(name="category_id", referencedColumnName="id", nullable=true)
 */
protected $category;

在这里和这里的文档中提到了预先加载。


2。Object存储库中编写自定义DQL查询并执行fetch连接:

/**
 * Find object using DQL with a category joined.
 *
 * @param int $id
 * @return Building|null
 */
public function findObject($id)
{
    $entityManager = $this->getEntityManager();
    $query = $entityManager->createQuery(
        "SELECT o, c FROM Object o JOIN o.category c WHERE o.id = :id"
    );
    $query->setParameter('id', $id);
    $query->getOneOrNullResult();
}

这类连接在这里的文档中有解释。注意fetch-join和常规连接之间的区别。


3。或者在您的Object存储库中使用Doctrine QueryBuilder来获得相同的结果:

/**
 * Find object using query builder with a category joined.
 *
 * @param int $id
 * @return Building|null
 */
public function findObject($id)
{
    $queryBuilder = $this->createQueryBuilder('o')
        ->addSelect('c')
        ->leftJoin('o.category', 'c')
    }
    return = $queryBuilder->getQuery()->getOneOrNullResult();
}

请注意,如果您想要fetch-join,您还需要在查询中添加addSelect条件,否则它是一个常规连接。