目前,我的搜索查询仅搜索完全匹配和正确的顺序。但是我需要的话语顺序并不重要。
例如,
新闻标题:内马尔转投PSG。
我在下一次搜索中得到正确的结果
内马尔PSG
内马尔飞往PSG
但我没有结果:
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")
)
如何使单词顺序不重要?
最佳答案
这是您的$ 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;“内马尔PSG”
如果使用orWhere()选项,则可以获得四个记录。
希望能帮助到你