2 つのエンティティ クラス と がProduct
ありOrderEntry
、次のように定義されています (簡潔にするために一部の注釈は省略されています)。
class Product {
/**
* @Id
*/
protected $id;
/**
* @Column()
* @Id
*/
protected $prodNumber;
/**
* @Column()
* @Id
*/
protected $group;
// more cols here
}
class OrderEntry {
// more cols here
/**
* @ManyToOne(targetEntity="Product")
* @JoinColumns({
* @JoinColumn(name="prodNumber", referencedColumnName="prodNumber"),
* @JoinColumn(name="group", referencedColumnName="group")
* })
*/
protected $Product;
}
ここで、クエリ ビルダーを使用して、関連付けられた Product で OrderEntry を見つけたいと考えています。私にとって最も論理的なことはこれです:
class OrderEntryRepository extends EntityRepository {
public function findByProduct($product) {
$qb = $this->getQueryBuilder('o');
$qb->where($qb->expr()->eq('o.Product', '?1')
->setParameter(1, $product)
->setMaxResults(1);
return $qb->getQuery()->execute();
}
}
ただし、これは次のような例外をスローします
複合主キーを持つエンティティへの単一値関連パス式はサポートされていません。クエリで複合主キーのコンポーネントに明示的に名前を付けます。
コンポーネントに明示的に名前を付けるにはどうすればよいですか? JOIN を使用して実行できることはわかっていますが、この場合、Product は使用できず、クエリのコストが高くなるだけです。