duanba4254 2017-11-09 11:02
浏览 35
已采纳

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

Currently, my search query search only exact match and correct order. But I need that order of words is not important.

For example, news title: Neymar to PSG. I got correct results in next searches

  • Neymar PSG
  • Neymaar to PSG

But i have no results for:

  • PSG Neymar

This is my code:

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

How to make that word order is not important ?

  • 写回答

1条回答 默认 最新

  • duanao2585 2017-11-09 13:47
    关注

    This is what is the content of your $searchTermPartial

    //%PSG%%Neymar%
    

    I have a table like this

    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;
    

    the values of role field are [PSG Neymar,Neymar PSG,PSG, Neymar] (4 different rows)

    When I execute the query with the content above this is the result

    query select * from rol where role like '%PSG%%Neymar%'

    result 1;"PSG Neymar"

    the problem is that you are building wrong the parameter you should use it this way:

        foreach ($searchTerms as $key => $term) {
    //.....
                    $qb->andWhere($qb->expr()->like('r.role', ':term' . $key))
                        //.....
                        ->setParameter('term' . $key, '%' . $term . '%');
    //.....
                }
    

    the above code will output the following query

    select * from rol where role like '%PSG%' and role like '%Neymar%'
    

    with this result

    1;"PSG Neymar"

    2;"Neymar PSG"

    If you use orWhere() option you could get the four records.

    Hope it helps

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 wegame打不开英雄联盟
  • ¥15 公司的电脑,win10系统自带远程协助,访问家里个人电脑,提示出现内部错误,各种常规的设置都已经尝试,感觉公司对此功能进行了限制(我们是集团公司)
  • ¥15 救!ENVI5.6深度学习初始化模型报错怎么办?
  • ¥30 eclipse开启服务后,网页无法打开
  • ¥30 雷达辐射源信号参考模型
  • ¥15 html+css+js如何实现这样子的效果?
  • ¥15 STM32单片机自主设计
  • ¥15 如何在node.js中或者java中给wav格式的音频编码成sil格式呢
  • ¥15 不小心不正规的开发公司导致不给我们y码,
  • ¥15 我的代码无法在vc++中运行呀,错误很多