SymfonyベースのEC-CUBEというネットショップシステムで開発しているときに、発生したエラーについて解決法などを調べたので備忘録としてブログに残します。
ちょっと重たいSQLを発行しなければならなかったので、ORMのiterateで処理しようとしたところ、下記エラーが発生しました。
Iterate with fetch join in class Eccube\Entity\ProductClass using association Product not allowed.
Gitで解決につながる記載を見つけました。
→Iterate with fetch join in subquery
Iterate with fetch join in class ~ not allowed.エラー解消
Gitの文を要約すると、distinct
してねということです。
select
に対してdistinct
を実行してあげることで解決することができました。
ちなみにdistinct
は重複するレコードを一つにまとめる命令になります。
解決したコード
$qb->select('p, pc') ->distinct(); $result = $qb->iterate(); …
原因
上記エラーは、取得するEntity内にJoinしていると発生するようです。
実際のEntityの部分は下記です。(EC-CUBE src)
/** * @var \Doctrine\Common\Collections\Collection * * @ORM\OneToMany(targetEntity="Eccube\Entity\ProductClass", mappedBy="Product", cascade={"persist","remove"}) */ private $ProductClasses;
Entity/Product.php
の中でProductClass
をJoinしている例になります。上記のように、Joinしている場合にdistinct()
してあげる必要があります。