【问题标题】:Remove special characters with doctrine删除带有教义的特殊字符
【发布时间】:2019-11-05 18:14:39
【问题描述】:

我在我的数据库中搜索了一个城市,当我输入“Aulnay-sous-bois”时没问题,我可以找到有问题的城市,但是当我输入“Aulnay sous-bois”时它不起作用!

我已经尝试删除字符,但它不起作用

我的代码控制器:

public function verifyCity(Request $request, CityRepository $cityRepository): JsonResponse
    {
        if($request->isXmlHttpRequest()) {
            $data = [];
            $searchs = $cityRepository->findBySearchCity($request->request->get('city'));
            /**
             * @var $searchs City[]
             */
            foreach ($searchs as $search) {
                $data[] = [
                    'name' => $search->getName(),
                    'zipCode' => $search->getZipCode()
                ];
            }

            return new JsonResponse(['city' => $data, 'ok' => 1]);
        }
        return new JsonResponse(['error' => 'not found']);
    }

我的仓库

public function findBySearchCity($search,$zipCode = null)
    { //SELECT * FROM `city` WHERE name LIKE "%la courn%" OR zip_code LIKE "78%"
         $query =$this->createQueryBuilder("c")
            ->where('c.name LIKE :search')
            ->setParameter('search', "%".$search."%");
         if($zipCode != null) {
             $query->orWhere('c.zipCode LIKE :zipCode')
                 ->setParameter('zipCode', $zipCode."%");
         }
         return $query->getQuery()->setMaxResults(5)
             ->getResult();

    }

和Js:

   var cityTabs = [];
    $('#registration_form_city').keyup(function () {

        var city = this.value;
        var data = {
            city: city,
        };
        $.ajax({
            url: $('#wizardProperty').attr('data-verify-city'),
            type: 'POST',
            data: data,
            dataType: 'JSON',
            success: function (data) {
                cityTabs = [];
                if(data.ok == 1) {
                    $.each(data.city,function (k, v) {
                        cityTabs.push(v.name);
                    });
                }
                console.log(cityTabs);
                $( "#registration_form_city" ).autocomplete({
                    source: cityTabs
                });
            },
            error: function (data) {
                console.log(data)
            }
        });
    });

如上所述,当我使用破折号准确键入时,它可以工作,但是当我不使用破折号键入时,它不再起作用,如何在删除“-”的同时显示结果

【问题讨论】:

    标签: php sql symfony doctrine


    【解决方案1】:

    您可以使用preg_split()implode() 修改存储库方法中的$search 参数值,以将破折号和空格替换为% 通配符。

    public function findBySearchCity($search,$zipCode = null)
    { //SELECT * FROM `city` WHERE name LIKE "%la%courn%" OR zip_code LIKE "78%"
    
        $search = preg_split("/[\s,-]+/", $search);
        $search = implode("%", $search);
    
         $query =$this->createQueryBuilder("c")
            ->where('c.name LIKE :search')
            ->setParameter('search', "%".$search."%");
         if($zipCode != null) {
             $query->orWhere('c.zipCode LIKE :zipCode')
                 ->setParameter('zipCode', $zipCode."%");
         }
         return $query->getQuery()->setMaxResults(5)
             ->getResult();
    
    }
    

    因此,您的术语“Aulnay-sous-bois”或“Aulnay sous-bois”都将导致使用以下查询:
    ... LIKE '%Aulnay%sous%bois%'

    【讨论】:

    • 您好,感谢您的回复,我试过了,但还是不行!
    【解决方案2】:

    我将使用MySQL's Full-Text Search 函数为您提供不同的选择。让我们开始准备桌子:

    ALTER TABLE city ADD FULLTEXT (`name`);
    

    【讨论】:

      【解决方案3】:

      纠正 Arleigh 的答案,查询应该是这样的:

      public function findBySearchCity($search, $zipCode=null) {
          // Can be done in one line with preg_replace()
          // Replace underscore, any white-space and any non-word character with '%'
          $search=preg_replace("/[_\W\s]+/", '%', $search);
      
          // Always split init from the rest of the query in case you need to use `$qb->expr()`
          $qb=$this->createQueryBuilder("city");
      
          if($zipCode !== null) {
              $qb->andWhere($qb->expr()->orX(
                      $qb->expr()->like("city.name", ":search"),
                      $qb->expr()->like("city.zipCode", ":zipCode")))
                 ->setParameter('zipCode', $zipCode.'%');
          } else {
              $qb->andWhere($qb->expr()->like("city.name", ":search"));
          }
      
          $qb->setParameter('search', '%'.$search.'%')
             ->setMaxResults(5);
      
          return $qb->getQuery()->getResult();
      }
      

      它应该像那样工作。
      如果没有,请转储查询,用它更新您的问题,然后在此处发表评论。

      提示:

      • 始终在查询中使用双引号。 Doctrine 将只接受字符串值的单引号(单引号可用于参数)。
      • 切勿使用where(),始终以andWhere()orWhere() 开头
      • 避免同时使用andWhere()orWhere()。首选expr() (read more here)
      • 避免将 DQL 与伪原生(LIKEIN 等)SQL 混合使用。如果 Doctrine 读取了一些它不能使用的原生 SQL,它会咀嚼你。请改用expr()。如果您在 expr() 中找不到您需要的内容,则意味着您应该创建一个原生查询。
      • 完整命名您的别名,以便以后阅读。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-05-30
        • 2014-05-27
        • 1970-01-01
        • 2018-01-19
        • 2015-04-11
        • 2021-11-02
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多