2015-03-02 97 views
0

我在Laravel中编码搜索功能,但我只能搜索完整的查询,这不是理想的解决方案。通过这个我的意思是,如果我通过一个像“lorem%20ipsum”这样的查询,我只会得到“lorem ipsum”的结果,而我不会像“lorem”或“ipsum”那样得到部分匹配。任何人都可以给我一些关于如何最好地完成这项任务的想法?在Laravel中搜索部分匹配

这是目前我的完整搜索代码:

routes.php文件

Route::get('{lang}/search/{query}', '[email protected]'); 

HomeController.php

public function searchPages($lang, $query) { 

    $searchResults = Search::acme($query, $lang); 

    return View::make('search.search') 
    ->with('searchResults', $searchResults); 
} 

型号/ page.php文件

class Page extends Eloquent { 

    public function scopeSearch($query, $search) 
    { 
     return $query->where(function($query) use ($search) 
     { 
      $query->where('title','LIKE', "%$search%") 
        ->orWhere('body', 'LIKE', "%$search%"); 
     }); 
    } 
} 

ACME /幕墙/ search.php中

namespace Acme\Facades; 

use Illuminate\Support\Facades\Facade; 

class Search extends Facade { 

    protected static function getFacadeAccessor() 
    { 
     return 'search'; 
    } 
} 

的Acme /搜索/ SearchServiceProvider.php

namespace Acme\Search; 

use Illuminate\Support\ServiceProvider; 

class SearchServiceProvider extends ServiceProvider { 

    public function register() 
    { 
     $this->app->bind('search', 'Acme\Search\Search'); 
    } 
} 

的Acme /搜索/ search.php中

namespace Acme\Search; 

use Illuminate\Support\Collection; 
use Page; 

class Search { 

    public function pages($search) 
    { 
     return Page::search($search)->get(); 
    } 

    public function acme($query, $lang) 
    { 
     return new Collection(Page::join('langs', 'langs.id', '=', 'pages.lang_parent_id') 
     ->where('title', 'LIKE', '%'.$query.'%') 
     ->orWhere('body', 'LIKE', '%'.$query.'%') 
     ->where('code', '=', $lang) 
     ->get() 
     ->toArray()); 
    } 
} 

回答

0

你需要遍历搜索文本,并建立你的口才,例如:

$db_query = Page::join('langs', 'langs.id', '=', 'pages.lang_parent_id'); 
$my_search_text_arr = explode(' ',$query); 

$first = true 
for_each($my_search_text_arr as $my_search_text){ 
    if($first){ 
     $db_query = $db_query->where('title', 'LIKE', '%'.$my_search_text.'%'); 
     $first = false; 
    }else{ 
     $db_query = $db_query->orWhere('title', 'LIKE', '%'.$my_search_text.'%'); 
    } 
} 

return new Collection($db_query 
     ->where('code', '=', $lang) 
     ->get() 
     ->toArray()); 
+0

这将工作,但我不知道是否还有更优化的一个。但这会做伎俩 – Ceeee 2015-03-03 06:45:24

+0

谢谢Cee。我不确定如何将查询“爆炸”到数组中。请注意,我必须在foreach循环内执行语言查询。您发布时它并未在收藏集中工作,我不知道为什么。 – 2015-03-03 14:58:34

+0

对于爆炸功能:这可能有助于http://www.w3schools.com/php/func_string_explode.asp – Ceeee 2015-03-04 00:02:37

相关问题