【问题标题】:Laravel Search Keyword QueryLaravel 搜索关键字查询
【发布时间】:2020-11-21 03:34:45
【问题描述】:

所以目前我已经创建了搜索文本字段来查找数据库特定列的关键字。

用这个雄辩的

$data = DB::table('product')
        ->select('product.id','product.title','product.description','product.content','product.photo','product.quantity','product.price')
        ->join('product_per_category','product_per_category.product_id','=','product.id')
        ->where(['product.deleted' => 0])
        ->where(['product_per_category.deleted' => 0])
        ->where(['product_per_category.productcategory_id' => $id])
        ->where(function($query) use ($keyword){
            $query->where('product.content', 'like', '%' . $keyword . '%')
                ->orWhere('product.title', 'like', '%' . $keyword . '%')
                ->orWhere('product.quantity', 'like', '%' . $keyword . '%')
                ->orWhere('product.price', 'like', '%' . $keyword . '%');
        })
        ->groupBy('product.id')
        ->paginate(10);

如果我尝试搜索价格的234.00 值,所有与content, title, quantity, price, quantity 的列匹配的可能值都会自动返回数据。

如果我尝试搜索这样的关键字会怎样

234.00 Books 的值是 PriceTitle。它现在不会返回任何数据。因为它只会匹配特定列上的这句话。

我想要做的是如果我搜索这样的东西

= 234.00 Books 20

*Value of Price, Title and Quantity

它应该返回每列匹配的所有数据。字母是小写还是大写只要匹配字母的位置即可

这可能吗?

** 更新 **

目标:只想匹配任何列上的234 值。成为结果。但我查询的问题是,如果我添加另一个关键字,如 234 Books,它不会返回任何数据

【问题讨论】:

  • 可以通过正则表达式从字符串值提取到变量。或者不同的方法应该是用“”(空格)在php中分解字符串并为每个关键字在哪里循环。在您的方法中,将 234.00、Books、20 作为单独的值在该列中搜索。
  • 问题将是您如何知道用户的意思是 234 是价格还是数量等。
  • 只想匹配任何列上的 234 值。成为结果。但我的查询的问题是,如果我添加另一个关键字,如 234 Books 它不会返回任何数据
  • okey,因此您需要以某种方式指定如何分隔输入的规则。如果您有这样的裁决,您可以执行下面发布的方法
  • 你用的是什么mysqlengine

标签: php mysql laravel


【解决方案1】:

第一: 提取关键字:

$delimeter = ' '; //or your separator
$keywords = explode($delimeter, $search); // Will return an array containing each keyword

然后:循环遍历每个关键字并调用您的搜索查询或动态扩展您的查询

示例 像这样的东西应该可以工作......

$base_query = DB::table('product')
        ->select('product.id','product.title','product.description','product.content','product.photo','product.quantity','product.price')
        ->join('product_per_category','product_per_category.product_id','=','product.id')
        ->where(['product.deleted' => 0])
        ->where(['product_per_category.deleted' => 0])
        ->where(['product_per_category.productcategory_id' => $id]);

foreach($keywords as $keyword){
       $base_query->where(function($query) use ($keyword){
            $query->where('product.content', 'like', '%' . $keyword . '%')
                ->orWhere('product.title', 'like', '%' . $keyword . '%')
                ->orWhere('product.quantity', 'like', '%' . $keyword . '%')
                ->orWhere('product.price', 'like', '%' . $keyword . '%');
            })
}

$result = $base_query->get();

您需要循环,因为您不知道搜索结果中的关键字数量

【讨论】:

    【解决方案2】:

    你可以像这样使用explode PHP function

    $keywords = explode(' ', $keyword); // Will return an array containing each keyword
    dd($keywords);
    

    如果您的关键字可以包含空格,您可能应该考虑使用另一个分隔符或拆分您的查询参数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-05
      • 2013-05-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多