仅通过查询构建器

时间:2015-12-31 07:27:05

标签: doctrine-orm query-builder

在doctrine中考虑查询构建器的以下表达式。

# fail
$em->createQueryBuilder()->select('m')->from('TbUsermanager','t')
                ->join('t.manager', 'm')
                ->where('t.user=:user')
                ->setParameter('user', 1)
                ->getQuery()
                ->getResult();

# success
$em->createQueryBuilder()->select('t')->from('TbUsermanager','t')
                ->join('t.manager', 'm')
                ->where('t.user=:user')
                ->setParameter('user', 1)
                ->getQuery()
                ->getResult();

对象TbUsermanagerTbUserTbManager之间的关系表。

它们的注释是

# user
     * @ORM\ManyToOne(targetEntity="TbUser")
     * @ORM\JoinColumns({
     *   @ORM\JoinColumn(name="user_id", referencedColumnName="ID")
     * })

# manager
     * @ORM\ManyToOne(targetEntity="TbManager")
     * @ORM\JoinColumns({
     *   @ORM\JoinColumn(name="manager_id", referencedColumnName="ID")
     * })

但是,为什么我不能只选择管理器对象?我怎样才能做到这一点?我试过m.id,它工作正常。

更新# fail查询中,我希望它返回对象TbManager的集合,但是,它会抛出以下异常

PHP Fatal error:  Uncaught exception 'Doctrine\ORM\Query\QueryException' with message 'SELECT m FROM TbUsermanager t INNER JOIN t.manager m WHERE t.user = 1' in C:\php_projects\zms_core\wcms\vendor\doctrine\orm\lib\Doctrine\ORM\Query\QueryException.php:41

如果我将select('m')更改为select('m.id'),这将返回TbManager ID的集合正常工作。

1 个答案:

答案 0 :(得分:0)

完整的错误消息将包含以下消息:

  

如果不选择至少一个根实体别名,则无法通过标识变量选择实体。

原因是Doctrine希望您从查询所基于的主要实体中选择数据(在您的示例中为TbUsermanager)。

一种可能的解决方案是只更改要从中选择的实体:

SELECT m
FROM TbManager AS m
JOIN TbUsermanager AS t WITH t.manager = m
WHERE t.user = :user

WITH可用于限制join子句(如果您可以根据实体的属性构建连接)或者根本不提供连接条件。