Symfony - 为由多对多关系创建的表构建查询



我有 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;
}

相关内容

  • 没有找到相关文章