不同的搜索词顺序在Symfony查询中应该具有相同的结果

时间:2017-11-09 11:02:54

标签: php mysql symfony

目前,我的搜索查询仅搜索完全匹配和正确的顺序。但我需要那些单词的顺序并不重要。

例如, 新闻标题: Neymar对PSG 。 我在下次搜索中得到了正确的结果

  • Neymar PSG
  • Neymaar to PSG

但我没有结果:

  • PSG Neymar

这是我的代码:

// 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")
        )

如何制作单词顺序并不重要?

1 个答案:

答案 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()选项,则可以获得四条记录。

希望有所帮助