跟进查询,不包括已收集的结果

时间:2014-08-15 18:42:26

标签: mysql sql symfony doctrine-orm dql

有点怪异

我在我的资源库中写了一个搜索函数,它接受一个字符串查询。

在此,它运行一个快速查询,在实体标题上使用通配符搜索,寻找标题第一位的匹配

然后我运行第二个查询(因为Doctrine2不支持Unions),然后通过整个标题进行一般的通配符搜索。

显然,这意味着它获得的结果与之前的查询相同。所以我想在第二个查询中告诉DQL,忽略已经获得的结果。

Buuut,我根本不知道如何提供这个

这是我的搜索功能:

    public function search($search) {

        $query = $this->getEntityManager()->createQueryBuilder();
        $query->select('v')
            ->from($this->getEntityName(), 'v')
            ->where($query->expr()->like('v.title', $query->expr()->literal(sprintf('%s%%', $search))));

        $set1 = $query->getQuery()->getResult();

        $query->where(
            $query->expr()->andX(
                $query->expr()->like('v.title', $query->expr()->literal(sprintf('%%%s%%', $search))),
                $query->expr()->notIn('v',  $set1) // Trying to provide the already acquired set of the results, to negate from this query
            )
        );

        $set2 = $query->getQuery()->getResult();

        $result = array_merge($set1, $set2);

        return $result;
    }

现在这不起作用,因为它试图将数组转换为字符串。

这可能听起来很自命不凡,但我想避免沿着第一组写一个循环,只是为了提取一个ID数组来提供第二组否定。我知道DQL支持读取完整实体对象和完整对象数组,我确定我没有遇到知道如何使用它的正确谓词方法。

1 个答案:

答案 0 :(得分:0)

我相信您可以通过where子句查询,并仅返回DISTINCT实体。

    $query = $this->getEntityManager()->createQueryBuilder();
    $query->select('v')
        ->from($this->getEntityName(), 'v')
        ->where($query->expr()->like('v.title', $query->expr()->literal(sprintf('%s%%',:search))))
        ->orWhere($query->expr()->like('v.title', $query->expr()->literal(sprintf('%%%s%%', :search))),
        ))
        ->setParameter('search', $search)
        ->distinct()
        ->getQuery();
        return $query->getResult();