2017-07-25 34 views
1

我的表格有一行存储为D1234 HEX SCREW GS0090 O109。目前我可以做这样的事情,如D1234 HEXSCREW GS0090,它会返回该行。不过,我希望能够以任何组合或任何顺序输入文字,如D1234 GS0090HEX D1234,并让它返回此行。如何才能做到这一点?按任意顺序或组合使用单词进行搜索并返回行

编辑:我使用Laravel 5.4,它使用MyISAM引擎

$products = DB::connection('it') 
      ->table('it') 
      ->join('units','units.code', '=', 's.code') 
      ->join('vendors', 'vendors.code', '=', 's.code') 
      ->where('s.deleted', '=', 0) 
      ->where('vendors.deleted', '=', 0) 
      ->where('s.description', 'LIKE', '%'.$term.'%') 
      ->orWhere('s.vendorcode', 'LIKE', '%'.$term.'%') 
      ->orWhere('s.vendordefaultcode','LIKE', '%'.$term.'%') 
      ->orWhere('vendors.partnumber', 'LIKE', '%'.$term.'%') 
      ->orWhere('vendors.partvendorcode', 'LIKE', '%'.$term.'%') 
      ->get()); 

回答

0

我建议使用全文搜索,如果你正在使用MySQL MySQL数据库。它主要用于高级搜索,但它很好地提高了您的搜索。

首先你需要一个fulltext索引添加到表中要使用全文搜索的每一列:

ALTER TABLE tablename ADD FULLTEXT(description); 

下一页修改查询:

$products = DB::connection('it') 
      ->table('it') 
      ->join('units','units.code', '=', 's.code') 
      ->join('vendors', 'vendors.code', '=', 's.code') 
      ->where('s.deleted', '=', 0) 
      ->where('vendors.deleted', '=', 0) 
      ->whereRaw("MATCH (s.description) AGAINST ('{$term}*' IN BOOLEAN MODE)") 
      ->orWhereRaw("MATCH (s.vendorcode) AGAINST ('{$term}*' IN BOOLEAN MODE)") 
      ->orWhereRaw("MATCH (s.vendordefaultcode) AGAINST ('{$term}*' IN BOOLEAN MODE)") 
      ->orWhereRaw("MATCH (vendors.partnumber) AGAINST ('{$term}*' IN BOOLEAN MODE)") 
      ->orWhereRaw("MATCH (vendors.partvendorcode) AGAINST ('{$term}*' IN BOOLEAN MODE)") 
      ->get()); 

一些链接,以帮助out

MySQL Full-Text Search with Multiple words

mySQL Full Text Search With Percentage Scoring

+0

唯一的问题是,如果我输入'D1234 HEX'它将返回所有包含'D1234'和'HEX'的行我只想要包含'D1234 HEX'的行返回 – derrickrozay

+0

实际上我认为它返回所有行第一个词,即'D1234' – derrickrozay

相关问题