Error: Invalid PathExpression. エラー解消[Symfony]

SymfonyとDoctrineの記事になります。
各バージョンは次の通りです。
Symfony 3.4
Doctrine 2.12

大体ErrorはErrorメッセージを追うことで解消できることが多いのです。
今回は、下記エラーを解消した時の備忘録になります。

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

上記はORMのSELECTにJOINしているテーブルの外部キーを指定したときに発生しました。

Error: Invalid PathExpression. エラー発生

下記コードを実行した際にエラーが発生しました。
Joinしているテーブルに対して、直接p.TagとSELECTしてしまっています。
今思えば、これでは取得できないのは当然ですね!

// In Product.php Entity
    /**
     * @var \Eccube\Entity\Tag
     *
     * @ORM\ManyToOne(targetEntity="Eccube\Entity\Tag")
     * @ORM\JoinColumns({
     *   @ORM\JoinColumn(name="tag_id", referencedColumnName="id", nullable=false)
     * })
     */
    private $Tag;
...

// Query in ProductRepository
    $qb = $this->createQueryBuilder('p')
        ->select([
            'p.name',
            'p.Tag'
        ]);

 

Error: Invalid PathExpression. エラー解消法

下記IDENTITY()関数を使用することで、直に取得することが可能でした。

// Query in ProductRepository
    $qb = $this->createQueryBuilder('p')
        ->select([
            'p.name',
            'IDENTITY(p.Tag) as tag_id'
        ]);

とはいえ、解消してから気づいたのですが普段上記エラーが出ないのは、きちんとJOINをqueryで定義していたからですね。
下記のように書いてもエラー解消できます。

// Query in ProductRepository
    $qb = $this->createQueryBuilder('p')
        ->leftJoin('p.Tag', 't')
        ->select([
            'p.name',
            't.id as tag_id'
        ]);

 

まとめ

普段と違う書き方で発生したエラーで、新たな関数を発見できて幸運でした。
IDENTITY()とかいままで使ったことがなかったですが、簡易的に取得できて便利に感じました。

下記サイトを参考にしました。SELECTに関する情報が網羅されています。
Doctrine Query Language

Symfonyおすすめ書籍

あまり種類がないのと、そもそもフレームワークとして情報が膨大なので、入門でも結構読み応えがあります。
「PHPフレームワーク Symfony 4入門」


コメントを残す 0

Your email address will not be published.

eight − 5 =