Symfony2 và Doctrine - Lỗi: PathExpression không hợp lệ. Phải là StateFieldPathExpression


91

Tôi có một thực thể trông giống như sau:

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

}

và tôi đang cố chạy một truy vấn như sau:

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

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

Tuy nhiên, tôi gặp lỗi sau:

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

Làm cách nào để chọn trường parent_id từ bảng của tôi. Tôi đã thử một loạt các biến thể và ngay cả khi tôi làm như thế này:

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

Tôi nhận được tất cả các trường trong bảng ngoại trừ parent_id. Điều này có vẻ như Doctrine đang cản trở. Làm cách nào để tôi có thể truy vấn trường parent_id này? hoặc tốt hơn nữa làm cách nào tôi có thể lấy tất cả các trường trong bảng bao gồm cả parent_id

Câu trả lời:


232

Bạn có thể sử dụng IDENTITYchức năng hiện không có tài liệu để chọn ID FK trong một truy vấn:

SELECT IDENTITY(c.parent) ...

6
Chỉ cần tìm thấy nó được ghi lại trong docs.doctrine-project.org/projects/doctrine-orm/en/latest/…
alex88

7
Ngài đã cứu một ngày của tôi!
cúm

1
Điều này trả về id fk cho thực thể đó. Làm thế nào bạn sẽ viết tắt thực thể đó? $query->getResult(\Doctrine\ORM\Query::HYDRATE_OBJECT);(Tham số mặc định) dường như bị ghi đè bởi hàm nhận dạng.
Eggmatters

Cảm ơn bạn, điều đó đã giúp tôi cuối cùng xây dựng CHỌN TRONG (CHỌN) của mình!
Imeksbank

4
Đây cũng hoạt động khi sử dụng xây dựng truy vấn: $qb->select('identity(c.parent)').
scyrma

12

Giải pháp sử dụng createQueryBuilder:

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

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

5

Bạn đang chọn một đối tượng không được tham gia. Giống như đã nói trong một câu trả lời khác, bạn phải làm điều gì đó như:

qb->innerJoin("c.parent", "p")
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.