Iterate with fetch join in class ~ not allowed.エラー修正[Symfony]

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