【发布时间】:2014-03-15 19:05:39
【问题描述】:
我有 4 个层次相关的实体:Company、Department 和 Employee。 Company 和 Department 与多对一双向关系相关。 Department 和 Employee 通过另一个具有 2 个 OneToMany 双向关系的实体相关联,因为我需要该关系的附加参数。所以基本上最终的架构是这样的:
Company <-> Department <-> DepartmentEmployee <-> Employee
我正在尝试从当前用户的公司中选择一个部门,并获取该部门的所有员工。我正在使用自定义存储库来使用查询构建器构建我的查询,如下所示:
// DepartmentRepository.php
public function getOneWithEmployees($slug, $company)
{
$qb = $this->createQueryBuilder('d')
->where('d.slug = :slug')
->andWhere('c.slug = :company')
->setParameters(array('slug' => $slug, 'company' => $company))
->leftJoin('d.company', 'c')
->addSelect('c')
->leftJoin('d.departmentEmployee', 'r')
->addSelect('r')
->leftJoin('r.employee', 'e')
->addSelect('e');
return $qb->getQuery()->getOneOrNullResult();
}
重点是减少查询的数量,但是当我执行这个查询时,我仍然得到对数据库的 32 个查询(我部门有 15 名员工)。
当我移除零件时
->leftJoin('r.employee', 'e')
->addSelect('e')
我只得到一个按预期执行的查询。
如何在不触发多个查询的情况下对左连接进行左连接?
【问题讨论】:
-
你能用
$qb->getQuery()->getResult();代替$qb->getQuery()->getOneOrNullResult();吗?您的请求可能只选择一名员工,并要求其他员工提出更多请求。 -
不,结果是一样的。但我想我找到了为什么要进行所有这些额外的查询。我会在下面解释。
-
好吧,抱歉,我以为
getOneOrNullResult()只会获取一个Employee,但它必须只获取一个Department(及其员工),这是正确的。 -
没错。两种方法都返回一个
Department,除了getResult()被封装在一个数组中。
标签: symfony join doctrine-orm left-join