在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();
对象TbUsermanager
是TbUser
和TbManager
之间的关系表。
它们的注释是
# 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的集合正常工作。
答案 0 :(得分:0)
完整的错误消息将包含以下消息:
如果不选择至少一个根实体别名,则无法通过标识变量选择实体。
原因是Doctrine希望您从查询所基于的主要实体中选择数据(在您的示例中为TbUsermanager
)。
一种可能的解决方案是只更改要从中选择的实体:
SELECT m
FROM TbManager AS m
JOIN TbUsermanager AS t WITH t.manager = m
WHERE t.user = :user
WITH
可用于限制join子句(如果您可以根据实体的属性构建连接)或者根本不提供连接条件。