有点奇怪
我在我的存储库中编写了一个接受字符串查询的搜索函数。
在此,它运行快速查询,对实体标题进行通配符搜索,寻找标题第一位的匹配项
然后我运行第二个查询(因为 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 支持读取完整实体对象和完整对象数组,我确信我只是没有遇到知道如何使用它的正确谓词方法。
我相信您可以通过两个 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();