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

Mike
sumber

Jawaban:

236

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

SELECT IDENTITY(c.parent) ...
Jani Hartikainen
sumber
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();
pengguna3497021
sumber
5

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

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