后续查询,不包括已经收集的结果

问题描述 投票:0回答:1

有点奇怪

我在我的存储库中编写了一个接受字符串查询的搜索函数。

在此,它运行快速查询,对实体标题进行通配符搜索,寻找标题第一位的匹配项

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

显然这意味着它得到与之前查询相同的结果。因此,我希望在第二个查询中告诉 DQL,忽略已经获取的结果。

但是,我根本不知道如何提供它

这是我的搜索功能:

    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 支持读取完整实体对象和完整对象数组,我确信我只是没有遇到知道如何使用它的正确谓词方法。

php sql symfony doctrine-orm dql
1个回答
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();
© www.soinside.com 2019 - 2024. All rights reserved.