我有2个实体连接到第3个表中的多对多关系,我希望得到每种颜色的产品ID:
/**
* @var ArrayCollection
*
* @ORM\ManyToMany(targetEntity="AppBundle\Entity\Color", inversedBy="products")
* @ORM\JoinTable(name="products_colors",
* joinColumns={@ORM\JoinColumn(name="product_id", referencedColumnName="id")},
* inverseJoinColumns={@ORM\JoinColumn(name="color_id", referencedColumnName="id")}
* )
*/
private $colors;
在我的第二个实体中:
/**
* @var ArrayCollection
*
* @ORM\ManyToMany(targetEntity="AppBundle\Entity\Product", mappedBy="colors")
*/
private $products;
这是我的疑问:(我试图加入一些但不能让它起作用)
class ProductRepository extends \Doctrine\ORM\EntityRepository
{
public function getColors($id)
{
$query = $this->createQueryBuilder('p')
->join('AppBundle\Entity\Color', 'c')
->where('c.product_id = :id')
->setParameter('id', $id)
->getQuery()
->getResult();
return $query;
}
}
我收到了这个错误:
[语义错误]第0行,第85行'product_id ='附近:错误:类 AppBundle \ Entity \ Color没有名为product_id的字段或关联
我理解,但想不到让这项工作的方法。
答案 0 :(得分:1)
Symfony希望您在使用ManyToMany关系映射时引用对象的实体(而不是id)。尝试:
class ProductRepository extends \Doctrine\ORM\EntityRepository
{
public function getColors(Product $product)
{
$query = $this->createQueryBuilder('p')
->join('AppBundle\Entity\Color', 'c')
->where('c.product = :product')
->setParameter('product', $product)
->getQuery()
->getResult();
return $query;
}
}
当然,您必须相应地修改对此功能的调用。
您还可以使用实体中的getter函数完全跳过查询创建; symfony会自动为您执行查询。
// class Product
private $colors; // as you have it set up already
/**
* @return ArrayCollection|Color[]
*/
public function getColors()
{
return $this->colors;
}