Symfony2 e Doctrine - Errore: PathExpression non valido. Deve essere un StateFieldPathExpression


91

Ho un'entità che assomiglia a questa:

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

}

e sto cercando di eseguire una query come questa:

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

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

Tuttavia, ricevo il seguente errore:

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

Come posso selezionare il campo parent_id dalla mia tabella. Ho provato un sacco di varianti e anche se faccio qualcosa del genere:

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

Ottengo tutti i campi nella tabella ad eccezione di parent_id. Sembra che Dottrine si stia intromettendo. Come posso eseguire una query per questo campo parent_id? o meglio ancora come posso ottenere tutti i campi nella tabella incluso parent_id

Risposte:


232

È possibile utilizzare la IDENTITYfunzione attualmente non documentata per selezionare gli ID FK in una query:

SELECT IDENTITY(c.parent) ...


7
Signore, mi hai appena salvato la giornata!
influenza

1
Questo restituisce l'id fk per quell'entità. Come descriveresti quell'entità? $query->getResult(\Doctrine\ORM\Query::HYDRATE_OBJECT);(Il parametro predefinito) è apparentemente sovrascritto dalla funzione di identità.
pasta d'uovo

Grazie, questo mi ha aiutato finalmente a costruire il mio SELECT IN (SELECT)!
Imeksbank

4
Questo funziona anche quando si utilizza il generatore di query: $qb->select('identity(c.parent)').
scyrma

12

Soluzione che utilizza createQueryBuilder:

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

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

5

Stai selezionando un oggetto che non è unito. Come detto in un'altra risposta, devi fare qualcosa del tipo:

qb->innerJoin("c.parent", "p")
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.