Symfony2 y Doctrine - Error: PathExpression no válido. Debe ser una expresión StateFieldPathExpression

91

Tengo una entidad que se parece a esto:

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

}

y estoy tratando de ejecutar una consulta como esta:

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

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

Sin embargo, recibo el siguiente error:

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

¿Cómo puedo seleccionar el campo parent_id de mi tabla? He probado un montón de variaciones e incluso si hago algo como esto:

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

Obtengo todos los campos de la tabla excepto el parent_id. Parece que Doctrine se interpone en el camino. ¿Cómo puedo consultar este campo parent_id? o mejor aún, ¿cómo puedo obtener todos los campos de la tabla, incluido el parent_id?

Miguel
fuente

Respuestas:

232

Puede usar la IDENTITYfunción actualmente no documentada para seleccionar los ID de FK en una consulta:

SELECT IDENTITY(c.parent) ...
Jani Hartikainen
fuente
6
Acabo de encontrar que está documentado en docs.doctrine-project.org/projects/doctrine-orm/en/latest/…
alex88
7
¡Señor, acaba de salvarme el día!
gripe
1
Esto devuelve el fk id para esa entidad. ¿Cómo hyrdate esa entidad? $query->getResult(\Doctrine\ORM\Query::HYDRATE_OBJECT);(El parámetro predeterminado) aparentemente está anulado por la función de identidad.
eggmatters
¡Gracias, eso me ayudó finalmente a construir mi SELECT IN (SELECT)!
Imeksbank
4
Esto también funciona cuando se utiliza el generador de consultas: $qb->select('identity(c.parent)').
scyrma
12

Solución usando createQueryBuilder:

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

$result = $query->getQuery()->getArrayResult();
usuario3497021
fuente
5

Está seleccionando un objeto que no está unido. Como se dijo en otra respuesta, debes hacer algo como:

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