我试图在原则2中的一个高级查询中加入两个实体。我正在使用Zend Framework 2.
不幸的是,我很难在我现在所做的事情中找到正面和反面。
这是我在ZF2中得到的:
- 我已经建立了一个模块,叫做
- 它附加到一个名为categorize的事件,该事件将获得一个实体类型
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,我认为我应该能够通过在原则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
条件,否则它是一个常规连接。