Symfony2复杂查询生成器M2M拥有

时间:2016-02-15 23:38:32

标签: php symfony many-to-many query-builder

我正在尝试进行复杂的搜索。让我们说例如我有一个带有Title&的Book实体。描述属性,它通过多对多关系链接到标签和审阅者。

我可以通过查询获得的最接近的内容如下:

     $qb = $this->createQueryBuilder('b')
        ->leftJoin('b.tags', 't')
        ->leftJoin('b.reviewers', 'r');

    $ands = $qb->expr()->andX();

    // Criteria Check
    $ors = $qb->expr()->orX();
    $ors->add($qb->expr()->like('b.title', ':criteria'));
    $ors->add($qb->expr()->like('b.description', ':criteria'));
    $ands->add($ors);
    $qb->setParameter('criteria', "%".$criteria."%");

    // Tags
    $ands->add($qb->expr()->in('t.id', ":tag_var"));
    $qb->setParameter("tag_var", [1,2]);

    // Reviewers
    $ands->add($qb->expr()->in('r.id', ":reviewer_var"));
    $qb->setParameter("reviewer_var", [3,4]);

    // Add the wheres
    $qb->where($ands);
    return $qb->getQuery()->getResult();

如果例如一本书与至少1个标签相关联,那么它的效果很好但是我想确定的是如果一本书具有我为标签设置的两个ID的基础上如何获得结果?

1 个答案:

答案 0 :(得分:0)

你是说所有标签都必须匹配?我猜你有两个不同的要求,一些标签匹配,或者所有标签匹配。

您可以简单地将in更改为等于全包。

    // All tags must match
    $tagValues = [1,2];

    foreach ($tagValues as $index => $tag) {

        $ands->add($qb->expr()->eq('t.id', ":tag_var_$index"));
        $qb->setParameter("tag_var_$index", $tag);
    }

这些方面应该有所作为。