我在产品和颜色之间有很多关系。
我要尝试的是根据颜色查找产品。
例如)
$colours = $em->getRepository('Xxxxx\XxxxxBundle\Entity\Colour')->findBy(array('name'=>'red');
$products = $em->getRepository('Xxxxx\XxxxxBundle\Entity\Product')->findBy(array('colours'=>$colours));
这是我的Yaml配置:
Xxxxx\XxxxxBundle\Entity\Product:
type: entity
manyToMany:
colours:
targetEntity: Colour
joinTable:
name: Product_Colour
joinColumns:
product_id:
referencedColumnName: id
inverseJoinColumns:
colour_id:
referencedColumnName: id
。
Xxxxx\XxxxxBundle\Entity\Colour:
type: entity
id:
id:
type: integer
generator:
strategy: AUTO
fields:
hex:
type: string
length: 320
name:
type: string
length: 320
我收到的错误消息是:
Notice: Undefined index: joinColumns in /home/xxx/public_html/products/vendor/doctrine/lib/Doctrine/ORM/Persisters/BasicEntityPersister.php line 1217
有人能够阐明为什么它不起作用吗?
最佳答案
我知道这是一个老问题,但是如果有人通过Google到达这里(就像我一样),我就必须避开findBy并在存储库中使用DQL:
$products = $em->getRepository('Vendor\Bundle\Entity\Product')->findByColours($colours);
并在存储库中:
public function findByColours($colours)
{
$qb = $this->getEntityManager()->createQueryBuilder();
$qb ->select(array('p'))
->from('VendorBundle:Product', 'p')
->join('p.colours', 'c', 'WITH', $qb->expr()->in('c.id', $colours));
$result = $qb->getQuery()->execute();
return $result;
}
您可能需要根据$ colours更改联接。假设它是颜色ID的数组。如果是字符串,则可以放弃
in()
;或者,如果它是字符串数组,则需要将字符串绑定(bind)为参数(请参见以下链接)。对expr()的澄清在Doctrine docs中我不知道为什么会出现
Undefined index: joinColumns
,但这是一种完全避开它的方法。希望有人可以澄清错误,因为我的解决方案为“多对多”关系增加了额外的工作。