具有多个子字符串的Laravel DB Query

时间:2017-08-21 20:20:57

标签: php mysql laravel-5.1

我希望运行一个数据库查询,如果用户在两列中查询多个子字符串,则可以查询它们。例如,

第1列是国家/地区名称,第2列是城市和国家/地区名称。样本数据:

Column1| Column2
USA | Portland, Oregon, United States of America
USA | Portland, Maine, United State of America
USA | Bellevue, Washington, United State of America
USA | Bellevue, Nebraska, United State of America

现在用户可以使用各种选项进行查询。例如:

Portland America 
Portland USA
Portland Oregon USA
Portland Oregon America
Portland United States
... and so on

我希望构建一个可以为我解决此问题的查询。我尝试了where和orwhere的组合,但没有解决它。

进一步说明,第一栏中的国名也可以是中华民国。并且查询可以是来自同一列或列1和列2的两个单词或字符串的随机组合。或者它可以只是一个单词。

2 个答案:

答案 0 :(得分:1)

在这种情况下,您将要分解字符串并搜索每个部分。

DB::table('table_name')->where(function($query) use ($string) {
     $parts = explode(' ', $string);
     foreach($parts as $part) {
          $query->where('Column2', 'LIKE', "%$part%")
     }
})->get();

这会将查询转换为以下内容:

 SELECT * FROM table_name 
     WHERE Column2 LIKE '%Portland%' 
     AND Column2 LIKE '%America%'

要同时检查Column1,添加另一个where子句,但这次使用Or:

DB::table('table_name')->where(function($query) use ($string) {
     $parts = explode(' ', $string);
     foreach($parts as $part) {
          $query->where('Column2', 'LIKE', "%$part%")
     }
})->where(function($query) use ($string) {
     $parts = explode(' ', $string);
     foreach($parts as $part) {
          $query->orWhere('Column1', 'LIKE', "%$part%")
     }
})->get();

这将查询更改为

 SELECT * FROM table_name 
     WHERE (Column2 LIKE '%Portland%' 
        AND Column2 LIKE '%USA%')
     AND (Column1 LIKE '%Portland%' OR Column1 LIKE '%USA%')

如果他们搜索USA,则可以,但如果他们搜索United States则不行。您可能需要更多地优化搜索参数,或添加一种方法来将缩写与国家/地区名称匹配。

答案 1 :(得分:0)

DB :: select(DB :: raw(SELECT *,MATCH(column1,coulmn2)AGAINST('中华民国上海')AS得分来自表WHERE MATCH(column1,coulmn2)AGAINST(& #39;中华民国上海')));提供我正在寻找的答案。它主要在两列中使用FULLTEXT SEARCh。