Symfony2 dan Doctrine - Error: PathExpression tidak valid. Harus berupa StateFieldPathExpression


91

Saya memiliki entitas yang terlihat seperti ini:

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

}

dan saya mencoba menjalankan kueri seperti ini:

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

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

Namun, saya mendapatkan kesalahan berikut:

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

Bagaimana cara memilih bidang parent_id dari tabel saya. Saya telah mencoba banyak variasi dan bahkan jika saya melakukan sesuatu seperti ini:

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

Saya mendapatkan semua bidang di tabel kecuali untuk parent_id. Ini sepertinya Doktrin menghalangi. Bagaimana cara menanyakan bidang parent_id ini? atau lebih baik lagi bagaimana saya bisa mendapatkan semua bidang dalam tabel termasuk parent_id

Jawaban:


236

Anda bisa menggunakan fungsi yang saat ini tidak terdokumentasi IDENTITYuntuk memilih ID FK dalam kueri:

SELECT IDENTITY(c.parent) ...

7
Baru saja ditemukan itu didokumentasikan di docs.doctrine-project.org/projects/doctrine-orm/en/latest/…
alex88

1
Ini mengembalikan id fk untuk entitas itu. Bagaimana Anda menghargai entitas itu? $query->getResult(\Doctrine\ORM\Query::HYDRATE_OBJECT);(Parameter default) tampaknya diganti oleh fungsi identitas.
eggmatters

Terima kasih, yang akhirnya membantu saya membangun SELECT IN (SELECT) saya!
Imeksbank

4
Hal ini juga bekerja ketika menggunakan query builder: $qb->select('identity(c.parent)').
scyrma

Ini bagus ketika mejanya besar. Intinya adalah Anda tidak ingin melembabkan apa pun yang tidak perlu dan Anda pasti tidak ingin melakukan penggabungan antara tabel besar. Anda hanya ingin mendapatkan ID dari kunci asing dan kemudian menggunakannya dalam kueri terpisah.
Miro Lehtonen

12

Solusi menggunakan createQueryBuilder:

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

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

5

Anda memilih objek yang tidak bergabung. Seperti yang dikatakan dalam jawaban lain, Anda harus melakukan sesuatu seperti:

qb->innerJoin("c.parent", "p")
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.