Symfony2 і доктрина - Помилка: невірний вираз PathExpression. Має бути StateFieldPathExpression


91

У мене є сутність, яка виглядає так:

/**
 * @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. 

Як я можу вибрати поле батьківського_ід зі своєї таблиці. Я спробував купу варіантів, і навіть якщо я роблю щось подібне:

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

Я отримую всі поля в таблиці, за винятком батьківського_ід. Здається, Доктрина заважає. Як я можу зробити запит для цього поля parent_id? або ще краще, як я можу отримати всі поля в таблиці, включаючи батьківський_ід

Відповіді:


232

Ви можете використовувати недокументовану IDENTITYфункцію, щоб вибрати ідентифікатори FK у запиті:

SELECT IDENTITY(c.parent) ...

6
Щойно знайшов, що це задокументовано у docs.doctrine-project.org/projects/doctrine-orm/en/latest/…
alex88,

7
Ви, сер, щойно врятували мені день!
грип

1
Це повертає ідентифікатор fk для цієї сутності. Як би ви гідратували цю сутність? $query->getResult(\Doctrine\ORM\Query::HYDRATE_OBJECT);(Параметр за замовчуванням), очевидно, замінений функцією ідентифікації.
eggmatters

Дякую, це допомогло мені нарешті побудувати мій SELECT IN (SELECT)!
Імексбанк

4
Це також працює при використанні конструктора запитів: $qb->select('identity(c.parent)').
scyrma

12

Рішення за допомогою createQueryBuilder:

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

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

5

Ви вибираєте об’єкт, який не об’єднано. Як сказано в іншій відповіді, ви повинні зробити щось на зразок:

qb->innerJoin("c.parent", "p")
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.