Использование полнотекстового поиска для поиска неполных слов по построителю запросов laravel - PullRequest
0 голосов
/ 13 июня 2018

Я хотел бы написать поисковый запрос, который использует предоставленную фразу для поиска в таблице, вернуть значение, соответствующее любой части фразы.этот код работает, но результаты ничего.Например, в таблице есть «abcde», и я искал «bcd», результат - ничто.

protected function fullTextWildcards($term)
{
    return str_replace(' ', '*', $term) . '*';
}

public function index(Request $request, $slug = null)
{
    $query = $slug
        ? \App\Tag::whereSlug($slug)->firstOrFail()->articles()
        : new \App\Article;
    if ($keyword = request()->input('q')) {
        $raw = 'MATCH(title,content) AGAINST(? IN BOOLEAN MODE)';
        $query = $query->whereRaw($raw, [$this->fullTextWildcards($keyword)]);
    }

    $articles=$query->latest()->paginate(10);
    return view('articles.index',compact('articles'));
}

Как связать все вместе, чтобы я достиг желаемого результата?
Заранее спасибо.

1 Ответ

0 голосов
/ 13 июня 2018

Вы можете просто использовать like в своем запросе, чтобы получить любые совпадения в данном столбце.Попробуйте это:

public function index(Request $request, $slug = null)
{
  $filter = ['keyword' => $request->q , 'slug' => $slug];

  $articles = \App\Tag::where(function ($q) use ($filter){

    //you can leave this I just put the so the code seems clean
    if ($filter['slug'] !== null) {
      $q->whereSlug($slug);
    }

    if ($filter['keyword']) {

      $keyword  = $this->fullTextWildcards($filter['keyword']);

      //you can use **like** this
      $q->where('title', 'like', "%".$keyword."%")->orWhere('content', 'like',  "%".$keyword."%");
    }

  })->latest()->paginate(10);


  return view('articles.index',compact('articles'));

}

Надеюсь, это поможет

...