2017-08-25 9 views
0

データベース内の書籍を検索する検索クエリがあります。タイトルと著者を検索します。多くの列と関連する並べ替えを使用した奇妙な検索

$searchQuery = explode(" ", $searchString); 
$results = $this 
       ->where(function ($query) use($searchQuery) { 
        for ($i = 0; $i < count($searchQuery); $i++){ 
         $query->orwhere('title', 'LIKE', '%' . $searchQuery[$i] .'%'); 
        } 
       }) 
       ->orWhereHas('authors', function ($query) use ($searchQuery) { 
        for ($i = 0; $i < count($searchQuery); $i++){ 
         $query->orwhere('author', 'LIKE', '%' . $searchQuery[$i] .'%'); 
        } 
       }) 
       ->get(); 

どのように私はそれがそうタイトル「マジックマウンテン」と最初の「トーマス・マン」作者のエントリを示して最適化することができますか?

編集:これは、MySQLのバージョンである:

select * from `books_catalogue` where (`title` LIKE '%magic%' or `title` LIKE '%mountain%' or `title` LIKE '%thomas%' or `title` LIKE '%mann%') or exists (select * from `authors` inner join `author_books_catalogue` on `authors`.`id` = `author_books_catalogue`.`author_id` where `author_books_catalogue`.`books_catalogue_id` = `books_catalogue`.`id` and (`author` LIKE '%magic%' or `author` LIKE '%mountain%' or `author` LIKE '%thomas%' or `author` LIKE '%mann')) or (`query` LIKE '%magic%' or `query` LIKE '%mountain%' or `query` LIKE '%thomas%' or `query` LIKE '%mann%');

+1

は、なぜあなたはループを使用していて、ちょうどあなたがタイトルの特定の著者を検索することができますクエリを使用していませんか?なぜあなたは 'LIKE'を使っていますか? – Noob

+0

ループ:検索文字列を次のように配列にするので、検索は同じではないため、データベースでは "thomas mann"と検索クエリ "mann" –

+0

などがありますが、 LIKE句を変更することはできません。 LIKEを使用すると、結果として常により多くの結果が得られます。あなたは正確にほしいものをより具体的にすることができます – Noob

答えて

0

私はvarchar型にタイトルと著者を含んでFULLTEXTフィールドを追加することになりました。そうすれば、私はMySQLのマッチ機能を使うことができます。それは流暢かつ迅速に動作します。

コードは次のようになります。

$results = $this 
 
       ->whereRaw("MATCH (search_summary) AGAINST ('".$searchString."') ORDER BY MATCH(search_summary) AGAINST('".$searchString."') ASC, books_catalogue.priority DESC;") 
 
       ->get();

関連する問題