Symfony2 和 Doctrine - 错误:无效的 PathExpression。必须是 StateFieldPathExpression

Posted

技术标签:

【中文标题】Symfony2 和 Doctrine - 错误:无效的 PathExpression。必须是 StateFieldPathExpression【英文标题】:Symfony2 and Doctrine - Error: Invalid PathExpression. Must be a StateFieldPathExpression 【发布时间】:2012-12-22 09:26:45 【问题描述】:

我有一个看起来像这样的实体:

/**
 * @Gedmo\Tree(type="nested")
 * @ORM\Table(name="categories")
 * @ORM\Entity()
 */
class Category extends BaseCategory


    /**
    * @ORM\OneToMany(targetEntity="Category", mappedBy="parent")
    */
    protected $children;

    /**
    * @Gedmo\TreeParent
    * @ORM\ManyToOne(targetEntity="Category", inversedBy="children")
    * @ORM\JoinColumn(name="parent_id", referencedColumnName="id", onDelete="SET NULL")
    */
    protected $parent;


我正在尝试运行这样的查询:

$qb = $this->em->createQueryBuilder()
            ->select('c.parent')
            ->from('Category', 'c');

$result = $qb->getQuery()->getArrayResult();

但是,我收到以下错误:

[Semantical Error] ... Error: Invalid PathExpression. Must be a StateFieldPathExpression. 

如何从表中选择 parent_id 字段。我尝试了很多变体,即使我做了这样的事情:

$qb = $this->em->createQueryBuilder()
            ->select('c')
            ->from('Category', 'c');

我得到了表中的所有字段除了的parent_id。这似乎是教义妨碍了。如何查询此 parent_id 字段?或者更好的是如何获取表中的 all 字段,包括 parent_id

【问题讨论】:

【参考方案1】:

您可以使用当前未记录的 IDENTITY 函数在查询中选择 FK ID:

SELECT IDENTITY(c.parent) ...

【讨论】:

刚刚发现它记录在docs.doctrine-project.org/projects/doctrine-orm/en/latest/… 这将返回该实体的 fk id。你会如何水合那个实体? $query->getResult(\Doctrine\ORM\Query::HYDRATE_OBJECT);(默认参数)显然被标识函数覆盖。 谢谢,这帮助我最终构建了我的 SELECT IN (SELECT)! 这也适用于使用查询生成器:$qb->select('identity(c.parent)') 当表格很大时,这很棒。关键是您不想补充任何不必要的东西,而且您绝对不想在大表之间进行任何连接。您只想获取外键的 ID,然后在单独的查询中使用它们。【参考方案2】:

使用 createQueryBuilder 的解决方案:

$query->SELECT('pa.id')
        ->from('Category', 'ca');
$query->join('ca.parent', 'pa');

$result = $query->getQuery()->getArrayResult();

【讨论】:

【参考方案3】:

您正在选择一个未连接的对象。 就像在另一个答案中所说的那样,您必须执行以下操作:

qb->innerJoin("c.parent", "p")

【讨论】:

以上是关于Symfony2 和 Doctrine - 错误:无效的 PathExpression。必须是 StateFieldPathExpression的主要内容,如果未能解决你的问题,请参考以下文章

Symfony2 - Doctrine - 在实体管理器刷新调用中捕获错误

在 Symfony2 中使用 Doctrine 映射异常错误

Symfony2 Doctrine 错误:无法计算使用 HAVING 子句的查询。使用输出步行器进行分页

使用 Symfony2 和 Doctrine 的 SQL Server 数据库连接

Symfony2,Doctrine,fixtures,数组到字符串的转换

在 Doctrine2/Symfony2 中的重复条目上插入忽略