目前,我的搜索查询仅搜索完全匹配和正确的顺序。但我需要那些单词的顺序并不重要。
例如, 新闻标题: Neymar对PSG 。 我在下次搜索中得到了正确的结果
但我没有结果:
这是我的代码:
// Create search tearm partial
$searchTerms = explode(' ', $this->query->getTerm());
$searchTermPartial = '';
foreach($searchTerms as $searchTerm) {
$searchTermPartial = $searchTermPartial . '%' . $searchTerm .'%';
}
//Search part in Query
->andWhere(
$queryBuilder->expr()->orX(
$queryBuilder->expr()->like(
$queryBuilder->expr()->concat('translation.title', $queryBuilder->expr()->concat(
$queryBuilder->expr()->literal(' '), 'translation.shortDescription')), ":searchTermPartial"),
$queryBuilder->expr()->eq('o.code', ":searchTerm")
)
如何制作单词顺序并不重要?
答案 0 :(得分:1)
这是$ searchTermPartial
的内容//%PSG%%Neymar%
我有一张这样的表
CREATE TABLE public.rol
(
id integer NOT NULL,
role character varying(255) NOT NULL,
CONSTRAINT rol_pkey PRIMARY KEY (id)
)
WITH (
OIDS=FALSE
);
ALTER TABLE public.rol
OWNER TO postgres;
角色域的值是[PSG Neymar,Neymar PSG,PSG,Neymar](4行不同)
当我使用上面的内容执行查询时,结果是
查询
select * from rol where role like '%PSG%%Neymar%'
结果1;" PSG Neymar"
问题是你构建了错误的参数,你应该这样使用它:
foreach ($searchTerms as $key => $term) {
//.....
$qb->andWhere($qb->expr()->like('r.role', ':term' . $key))
//.....
->setParameter('term' . $key, '%' . $term . '%');
//.....
}
上面的代码将输出以下查询
select * from rol where role like '%PSG%' and role like '%Neymar%'
有了这个结果
1;" PSG Neymar"
2;" Neymar PSG"
如果使用orWhere()选项,则可以获得四条记录。
希望有所帮助