Symfony2 ve Doctrine - Hata: Geçersiz PathExpression. StateFieldPathExpression olmalı


91

Şuna benzeyen bir varlığım var:

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

}

ve şöyle bir sorgu çalıştırmaya çalışıyorum:

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

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

Ancak şu hatayı alıyorum:

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

Tablomdan parent_id alanını nasıl seçebilirim? Bir sürü varyasyon denedim ve şöyle bir şey yapsam bile:

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

Tablodaki parent_id dışındaki tüm alanları alıyorum. Bu, Doktrin'in önüne geçiyor gibi görünüyor. Bu parent_id alanını nasıl sorgulayabilirim? veya daha iyisi parent_id dahil tablodaki tüm alanları nasıl alabilirim

Yanıtlar:


236

IDENTITYBir sorguda FK kimliklerini seçmek için şu anda belgelenmemiş işlevi kullanabilirsiniz:

SELECT IDENTITY(c.parent) ...


1
Bu, o varlığın fk kimliğini döndürür. Bu varlığa nasıl hükmedersiniz? $query->getResult(\Doctrine\ORM\Query::HYDRATE_OBJECT);(Varsayılan parametre), görünüşe göre kimlik işlevi tarafından geçersiz kılınır.
eggmatters

Teşekkürler, bu sonunda SELECT IN (SELECT) 'i oluşturmama yardımcı oldu!
Imeksbank

4
Sorgu oluşturucu kullanılırken bu da çalışır: $qb->select('identity(c.parent)').
scyrma

Masalar çok büyük olduğunda bu harika. Mesele şu ki, gereksiz hiçbir şeyi sulandırmak istemiyorsunuz ve kesinlikle büyük masalar arasında herhangi bir birleştirme yapmak istemiyorsunuz. Yalnızca yabancı anahtarın kimliklerini almak ve ardından bunları ayrı bir sorguda kullanmak istiyorsunuz.
Miro Lehtonen

12

CreateQueryBuilder kullanan çözüm:

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

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

5

Birleştirilmemiş bir nesneyi seçiyorsunuz. Başka bir cevapta da söylendiği gibi, şöyle bir şey yapmalısınız:

qb->innerJoin("c.parent", "p")
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.