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()してあげる必要があります。