在我们的网上商店,我们销售工业计算机系统的备件。因此,我们有2个主要类别:备件和计算机系统。用户可以通过备件类别或计算机系统搜索所需的备件。如果用户在主页上选择了他的计算机系统,他应该得到一个与他的计算机系统匹配的备件类别列表。
因此,我需要查询所有备件类别并按所有文章过滤它们,这些文章也属于预选计算机系统的类别。否则,用户可能会看到一个空类别。
我有 2 个教义:文章和类别 - 它们中的每一个都与许多对另一个相关:
类别实体
/**
* @ORMTable(name="categories")
* @ORMEntity(repositoryClass="Repository")
*/
class Category extends ModelEntity
{
/**
* @var ArrayCollection
*
* @ORMManyToMany(targetEntity="ModelsArticleArticle")
* @ORMJoinTable(name="articles_categories",
* joinColumns={
* @ORMJoinColumn(name="categoryID", referencedColumnName="id")
* },
* inverseJoinColumns={
* @ORMJoinColumn(name="articleID", referencedColumnName="id")
* }
* )
*/
private $articles;
文章实体:
/**
* @ORMEntity(repositoryClass="Repository")
* @ORMTable(name="articles")
*/
class Article extends ModelEntity
{
/**
* @var ArrayCollection
*
* @ORMManyToMany(targetEntity="ModelsCategoryCategory")
* @ORMJoinTable(name="articles_categories",
* joinColumns={
* @ORMJoinColumn(name="articleID", referencedColumnName="id")
* },
* inverseJoinColumns={
* @ORMJoinColumn(name="categoryID", referencedColumnName="id")
* }
* )
*/
protected $categories;
我正在尝试使用2个类别的文章查询所有类别。例如:获取所有类别,即文章在"此"类别中,但仅当相同的文章也在"那个"类别中时
。不幸的是,我不知道该怎么做。谁能帮我?
要查找属于给定文章列表的类别(每个类别必须与给定列表中的每篇文章相关联(,那么您可以使用一些聚合
$articleIds = [1,2,3,4,5];
$qb = $this->createQueryBuilder('c');
$qb->addSelect('COUNT(DISTINCT a.id) AS HIDDEN total_articles')
->innerJoin('c.articles', 'a')
->add('where', $qb->expr()->in('a', $articleIds))
->groupBy('c.id')
->having('total_articles = '.count($articleIds))
->getQuery()
->getResult();
- Symfony2 - Doctrine2 QueryBuilder 在 ManyToMany 字段中 的位置
- 原则查询生成器:多对一关系,其中多个子实体必须匹配
- Sql/Doctrine 查询,用于查找具有多对多关联的多个条件的数据
- 将带有子查询的 SQL 转换为原则查询生成器
多亏了M Khalid Junaid,我终于想通了。 这是我的最后一个查询:
// select all active root categories from the online shop
$builder = Shopware()->Models()->createQueryBuilder();
$builder->from('ModelsCategoryCategory', 'c')
->select('c as category')
->andWhere('c.active = 1')
->andWhere('c.parentId = 0');
// if the user already selected his computer system,
// only get articles, that are in both categories: the
// category of this particular computer system and the
// category of spare parts
if ($this->computerSystemCategoryId) {
$builder->addSelect('COUNT(DISTINCT a2.id) AS total_system_articles')
->leftJoin('c.articles', 'a2')
->leftJoin('a2.categories', 'c2')
->groupBy('c.id')
->having('total_system_articles > 0')
->andWhere($builder->expr()->in('c2', [$this->computerSystemCategoryId]));
}
$query = $builder->getQuery();
$categories = $query->getResult();
通过此查询,我只能获取与特定备件类别关联的备件,还可以获取与特定计算机系统类别 ID 关联的备件。