学说ORM:按2类别过滤文章



在我们的网上商店,我们销售工业计算机系统的备件。因此,我们有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 关联的备件。

相关内容

  • 没有找到相关文章

最新更新