我有 2 个实体与多对多关系连接到第 3 个表中,我想获取产品 id 的每个颜色:
/**
* @var ArrayCollection
*
* @ORMManyToMany(targetEntity="AppBundleEntityColor", inversedBy="products")
* @ORMJoinTable(name="products_colors",
* joinColumns={@ORMJoinColumn(name="product_id", referencedColumnName="id")},
* inverseJoinColumns={@ORMJoinColumn(name="color_id", referencedColumnName="id")}
* )
*/
private $colors;
在我的第二个实体中:
/**
* @var ArrayCollection
*
* @ORMManyToMany(targetEntity="AppBundleEntityProduct", mappedBy="colors")
*/
private $products;
这是我的查询:(我试图进行一些连接,但无法使其工作)
class ProductRepository extends DoctrineORMEntityRepository
{
public function getColors($id)
{
$query = $this->createQueryBuilder('p')
->join('AppBundleEntityColor', 'c')
->where('c.product_id = :id')
->setParameter('id', $id)
->getQuery()
->getResult();
return $query;
}
}
我收到此错误:
[语义错误] 第 0 行,第 85 行靠近"product_id =":错误:类 AppBundle\Entity\Color 没有名为 product_id 的字段或关联
我理解,但想不出使这项工作的方法。
Symfony希望你在通过ManyToMany关系映射时引用对象的实体(而不是id)。尝试:
class ProductRepository extends DoctrineORMEntityRepository
{
public function getColors(Product $product)
{
$query = $this->createQueryBuilder('p')
->join('AppBundleEntityColor', '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;
}