【问题标题】:Search for partial matches in Laravel在 Laravel 中搜索部分匹配项
【发布时间】:2015-03-03 14:44:07
【问题描述】:

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

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

Routes.php

Route::get('{lang}/search/{query}', 'HomeController@searchPages');

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/Facades/Search.php

namespace Acme\Facades;

use Illuminate\Support\Facades\Facade;

class Search extends Facade {

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

Acme/Search/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/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());
    }
}

【问题讨论】:

    标签: php mysql laravel-4


    【解决方案1】:

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

    $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());
    

    【讨论】:

    • 这会起作用,但我不知道是否还有更优化的。但这会成功
    • 谢谢 Cee。我不确定如何将查询“分解”成数组。请注意,我必须在 foreach 循环中执行语言查询。正如您发布的那样,它在集合中不起作用,我不知道为什么。
    • 对于爆炸功能:这可能会有所帮助w3schools.com/php/func_string_explode.asp
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-11
    • 2012-10-05
    • 2019-10-20
    • 1970-01-01
    • 1970-01-01
    • 2017-04-26
    • 1970-01-01
    相关资源
    最近更新 更多