我正在尝试在Doctrine 2中的一个高级查询中加入两个实体。我正在使用Zend Framework 2.
不幸的是,我现在很难找到正在做的事情。
这是我在ZF2中得到的:
KryuuCategorizer
的模块,我将用它来对网站上的各种内容进行分类。分类程序有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文档,但是比我应该更加困惑。
答案 0 :(得分:6)
有几种方法可以达到你想要的效果。
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;
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。或者在QueryBuilder
存储库中使用Doctrine Object
来获得相同的结果:
/**
* 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
条件添加到查询中,否则它是常规联接。