在Doctrine 2中查询实体

Kat*_*yuu 3 php join doctrine-orm zend-framework2

我正在尝试在Doctrine 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
Run Code Online (Sandbox Code Playgroud)

Category->objects 受ManyToOne约束 Object->category

然后我需要手动将实体绑定到Object-> entityId,我想我应该能够通过在Doctrine 2中使用join来做到这一点.但我不知道从哪里开始或如何抓住它.我希望有人可以让我开始并向我展示正确的方向,我查看了Doctrine文档,但是比我应该更加困惑.

Wil*_*ilt 7

有几种方法可以达到你想要的效果.

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;
Run Code Online (Sandbox Code Playgroud)

此处此处的文档中提到了急切加载.


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();
}
Run Code Online (Sandbox Code Playgroud)

这些连接在此处的文档中进行了解释.观察fetch-join和常规联接之间的区别.


3.或者QueryBuilderObject存储库中使用Doctrine 来获得相同的结果:

/**
 * 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();
}
Run Code Online (Sandbox Code Playgroud)

请注意,如果要获取连接,还需要将addSelect条件添加到查询中,否则它是常规连接.