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

110

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

/**
 * @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 字段。我尝试了很多变化,即使我像这样做:


SELECT t1.parent_id FROM my_table t1 WHERE ...
$qb = $this->em->createQueryBuilder()
            ->select('c')
            ->from('Category', 'c');

我可以获取表中除了parent_id字段的所有字段。这似乎是Doctrine在干扰我的操作。我如何查询parent_id字段?或者更好的方法是,如何获取表中所有字段,包括parent_id?

4个回答

288

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

SELECT IDENTITY(c.parent) ...

7
刚刚发现这个内容已经在http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/dql-doctrine-query-language.html中有文档记录。 - alex88
2
这将返回该实体的外键ID。如何为该实体进行数据填充? $query->getResult(\Doctrine\ORM\Query::HYDRATE_OBJECT);(默认参数)显然被身份函数覆盖。 - eggmatters
谢谢,这帮了我终于构建我的SELECT IN (SELECT)! - Imeksbank
10
在使用查询构建器时,这也是有效的:$qb->select('identity(c.parent)') - scyrma
当表格非常大时,这是非常好的。关键是您不想使任何不必要的东西变得过于复杂,而且绝对不想在巨大的表之间进行任何连接。您只需要获取外键的ID,然后在单独的查询中使用它们即可。 - Miro Lehtonen
一个完整的例子会很有帮助。 - undefined

17

使用 createQueryBuilder 的解决方案:

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

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

10

你正在选择一个未连接的对象。就像另一个回答中所说,你需要做类似以下的操作:

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

3
您可以像这样进行更改:
 ->select(array('i.id','identity(i.parent) parent','i.nom'))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接