在 Doctrine 2 中加入查询实体

Joining Entities on query in Doctrine 2

我正在尝试在 Doctrine 2 的一个高级查询中加入两个实体。我正在使用 Zend Framework 2。

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

这是我在 ZF2 中得到的:

分类程序有 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,我想我应该可以通过在 Doctrine 2 中使用 join 来做到这一点。 但我不确定从哪里开始或如何掌握它。 我希望有人可以让我开始并向我展示正确的方向,我查看了 Doctrine 文档,但比我应该的更困惑。

有多种方法可以实现您想要的效果。

1.在关系定义中添加一个fetch="EAGER

为此,请将 fetch="EAGER" 添加到 Object 中的实体定义。

/** 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;

文档中提到了预加载 here and here


2. 在您的 Object 存储库中编写自定义 DQL 查询并执行获取连接:

/**
 * 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();
}

文档 here 中解释了这些类型的联接。观察 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();
}

请注意,如果要获取连接,还需要在查询中添加 addSelect 条件,否则就是常规连接。