我确实看到了this question,而活动认为这正是我所需要的。它与我的要求非常相似。然而,改变一点似乎破坏了整个逻辑。
这是我的架构:
/** @Entity **/
class Product
{
/**
* @ManyToMany(targetEntity="Category", inversedBy="products")
**/
private $categories;
public function __construct() {
$this->categories = new \Doctrine\Common\Collections\ArrayCollection();
}
// ...
}
/** @Entity **/
class Category
{
/**
* @ManyToMany(targetEntity="Product", mappedBy="categories")
**/
private $products;
public function __construct() {
$this->products = new \Doctrine\Common\Collections\ArrayCollection();
}
}
我需要查询不属于特定类别的所有产品。我的尝试是:
// ProductRepository
public function getProducts() {
return $this->createQueryBuilder('p')
->innerJoin('p.categories', 'c')
->where('c.id != :id')
->setParameter('id', 1)
->getQuery()
->getResult();
}
我不在此发布数据,因为此查询的结果是所有产品。我大约有5 000种产品,并且可以肯定的是,并非所有产品都属于我的类别。我尝试了不同的类别。它显示了不取决于我的查询的所有产品。
我还在这里保留SQL查询:
SELECT p0_.* FROM products p0_
INNER JOIN product_categories p2_ ON p0_.id = p2_.product_id
INNER JOIN categories c1_ ON c1_.id = p2_.category_id
WHERE c1_.id != 1
另一个问题是,它使我重复了产品。我可以使用group by p0_.id
,但不知道它是否有效。
我阅读了有关多对多关系以及如何查询它们的google信息,但所有有关平等查询的信息我都发现了,但我有非平等。