具有非相关实体的查询构建器中的“无效PathExpression。必须是StateFieldPathExpression”

时间:2014-03-26 16:02:42

标签: symfony doctrine-orm doctrine

我有四个实体:OfficialDocumentMediaNMediaStatusNMediaType。我试图翻译这个SQL:

SELECT od.media, od.type, od.status, md.url, nms.name 
    FROM official_document od 
    LEFT JOIN media md ON od.media = md.id 
    LEFT JOIN n_media_status nms ON od.status = nms.id
    WHERE od.company = 9 

到Doctrine Query Builder,这就是结果:

public function findOfficialDocument($company_id) {
    $qb = $this->getEntityManager()->createQueryBuilder();

    $qb->select('od.media', 'od.type', 'od.status', 'md.url', 'nms.name', 'nmt.name');
    $qb->from('Company\RegisterCompanyBundle\Entity\OfficialDocument', 'od');
    $qb->leftJoin('Common\MediaBundle\Entity\Media', 'md', \Doctrine\ORM\Query\Expr\Join::WITH, 'od.media = md.id');
    $qb->leftJoin('Common\MediaBundle\Entity\NMediaStatus', 'nms', \Doctrine\ORM\Query\Expr\Join::WITH, 'od.status = nms.id');
    $qb->leftJoin('Common\MediaBundle\Entity\NMediaType', 'nmt', \Doctrine\ORM\Query\Expr\Join::WITH, 'od.type = nmt.id');

    $qb->where('od.company = ?1');
    $qb->setParameter(1, $company_id);

    return $qb->getQuery()->getResult();
}

但是每当我从我的控制器调用该函数时,我都会收到此错误:

  

[语义错误]第0行,第10行靠近媒体,od.type,':错误:   无效的PathExpression。必须是StateFieldPathExpression。

     

[1/2] QueryException:SELECT od.media,od.type,od.status,md.url,   nms.name,nmt.name FROM   公司\ RegisterCompanyBundle \ Entity \ OfficialDocument od LEFT JOIN   Common \ MediaBundle \ Entity \ Media md WITH od.media = md.id LEFT JOIN   Common \ MediaBundle \ Entity \ NMediaStatus nms WITH od.status = nms.id   LEFT JOIN Common \ MediaBundle \ Entity \ NMediaType nmt WITH od.type =   nmt.id WHERE od.company =?1

OfficialDocument与其他三个实体相关,但由于我不需要这些实体中的reversedBy,因此我强调这是导致错误,或者可能不是,不确定它。无论如何,有任何建议或帮助来解决这个问题吗?

PS:我使用最新的Symfony2和Doctrine2,如果您需要查看我的实体,请访问:OfficialDocumentMediaNMediaStatus,{{3 }}

2 个答案:

答案 0 :(得分:58)

我回答自己,因为我找到了解决方法:

$qb->select('IDENTITY(od.media)', 'IDENTITY(od.type) AS doc_type', 'IDENTITY(od.status) AS doc_status', 'md.url', 'nms.name', 'nmt.name');

由于od.mediaod.typeod.status是复合键,因此我需要添加IDENTITY才能使查询正常工作并解决问题

答案 1 :(得分:16)

只需使用存在复合键的()即可。

$qb->select('(od.media)', '(od.type) AS doc_type', '(od.status) AS doc_status', 'md.url', 'nms.name', 'nmt.name');