有点怪异
我在我的资源库中写了一个搜索函数,它接受一个字符串查询。
在此,它运行一个快速查询,在实体标题上使用通配符搜索,寻找标题第一位的匹配
然后我运行第二个查询(因为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支持读取完整实体对象和完整对象数组,我确定我没有遇到知道如何使用它的正确谓词方法。
答案 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();