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

时间:2017-05-08 21:42:19

标签: php mysql symfony doctrine-orm

我有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的字段或关联

我理解,但想不到让这项工作的方法。

1 个答案:

答案 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;
}