【问题标题】:"Invalid PathExpression. Must be a StateFieldPathExpression" in query builder with non related entities“无效的 PathExpression。必须是 StateFieldPathExpression”在具有非相关实体的查询生成器中
【发布时间】:2014-05-05 04:35:37
【问题描述】:

我有四个实体: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();
}

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

[语义错误] line 0, col 10 near 'media, od.type,': 错误: 无效的路径表达式。必须是 StateFieldPathExpression。

[1/2] QueryException: SELECT od.media, od.type, od.status, md.url, nms.name, nmt.name FROM Company\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 左连接 Common\MediaBundle\Entity\NMediaType nmt WITH od.type = nmt.id WHERE od.company = ?1

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

PS:如果您需要查看我的实体,我正在使用最新的 Symfony2 和 Doctrine2,它们是:OfficialDocumentMediaNMediaStatusNMediaType

【问题讨论】:

    标签: symfony doctrine-orm doctrine


    【解决方案1】:

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

    $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 以使查询正常工作并解决问题

    【讨论】:

    • 我想选择实体对象,例如。媒体,键入而不是 FK id,然后该怎么办?
    【解决方案2】:

    只要存在复合键,您就可以使用()

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-12-22
      • 2014-02-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-28
      • 2023-03-25
      相关资源
      最近更新 更多