如何在laravel中搜索多个关键字。

时间:2017-10-16 09:19:11

标签: laravel search keyword

这是我的控制器

 $term = $request->get('q');

 // return $request->q;

 $products = Post::whereHas('user', function($query) use($term) {
     $query->where('name', 'like', '%'.$term.'%');
 })->orWhere('tags','LIKE','%'.$term.'%')->get();
 return view('pages.search', compact('products','users'));

这适用于单个关键字搜索。但我想将它用于多个关键字。像laravel php等。当我搜索多个值如abc php laravel或任何东西时,请引导我,那么它应该工作。如果标签存在于不同的列中,例如php存在于第1列,而laravel位于下一列,当我搜索php laravel时,它应该显示两个列值。

3 个答案:

答案 0 :(得分:1)

可能有更好的方法来实现这一点,例如使用CloudSearch / Algolia,但这是一个对我们有用的解决方案:

// Split the terms by word.
$terms = explode(" ", request('q'));

$products = Post::query()
    ->whereHas('user', function ($query) use ($terms) {
        foreach ($terms as $term) {
            // Loop over the terms and do a search for each.
            $query->where('name', 'like', '%' . $term . '%');
        }
    })
    ->orWhere(function ($query) use ($terms) {
        foreach ($terms as $term) {
            $query->where('tags', 'like', '%' . $term . '%');
        }
    })
    ->get();

答案 1 :(得分:0)

您需要先准备$terms数组,然后迭代它并添加orWhere()子句。

我刚刚对其进行了测试,对于whereHas()关闭,您需要在第一个学期使用where(),并为其余部分使用orWhere()以使其正常工作:

$posts = Post::whereHas('user', function($q) use($terms) {
        $q->where('name', 'like', '%' . $term .'%');

        foreach (array_slice($terms, 1) as $term) {
            $q->orWhere('name', 'like', '%' . $term .'%');
        }
    });

foreach ($terms as $term) {
    $posts->orWhere('tags', 'like', '%' . $term . '%');
}

$posts = $posts->get();

如果您决定使用=代替like,请使用whereIn(),而不是使用一堆orWhere()构建查询。

答案 2 :(得分:0)

在过去的几天中,我在此上花费了大量时间,这是我的解决方案。它与其他类似,但有所不同,因此有一天可能对某人有价值:

我有一个可以发出GET请求的Vue组件,因此$request->get('searchTerms')来自<input name="searchTerms">的HTML表单提交。

我想允许用户控制要搜索的字段,所以这就是$search_terms是要搜索的列数组的原因。

我想要这样,如果用户搜索“ McDonalds 604”,它将过滤记录列表并显示该搜索的两个不同匹配项。 business_name的一个匹配“ McDonalds”,phone_number的区域代码一个匹配“ 604”。这样可以确保用户在只知道一些片段的情况下获得所有相关的信息。

  

目标是遍历搜索词,并使用可以从任意数量的搜索词和列中应用的通用公式遍历搜索字段(列),并在运行时动态

        $search_fields = ['project_name', 'business_name', 'phone_number'];
        $search_terms = explode(' ', $request->get('searchTerms'));

        $query = Campaign::query();
        foreach ($search_terms as $term) {
            $query->orWhere(function ($query) use ($search_fields, $term) {

                foreach ($search_fields as $field) {
                    $query->orWhere($field, 'LIKE', '%' . $term . '%');
                }
            });
        }
        $filtered = $query->get();

我建议您仔细阅读Laravel的查询文档,因为它可以使您更好地了解此任务:https://laravel.com/docs/5.6/queries

在上面的代码中,我们正在使用parameter grouping,并且如果您使用whereorWhere,它将改变算法的特性。

奖励类事实

我还强烈建议使用$query->toSql()$query->getBindings()测试您的SQL语句。您可以将其替换为$query->get(),以查看其生成的SQL语句的外观以及参数绑定是什么。 getBindings()将向您显示?toSql()的值。