我有两个实体类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 没有用处,它只会使查询变得更加昂贵。