FORSMILE
EN
Symfony2021/05/11

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

大体ErrorはErrorメッセージを追うことで解消できることが多いのです。

ブログ一覧へ / Back to Blog

大体ErrorはErrorメッセージを追うことで解消できることが多いのです。

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

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

Error: Invalid PathExpression. エラー発生

Joinしているテーブルに対して、直接p.TagとSELECTしてしまっています。

javascript
// 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()関数を使用することで、直に取得することが可能でした。

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

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

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

まとめ

普段と違う書き方で発生したエラーで、新たな関数を発見できて幸運でした。

IDENTITY()とかいままで使ったことがなかったですが、簡易的に取得できて便利に感じました。

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

Symfonyおすすめ書籍

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

📦
Amazon で関連書籍・ツールを検索
Symfony PHP フレームワーク
Amazonで探す →(アソシエイトリンク)