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入門」