Laravel匹配多个搜索词

时间:2017-12-26 18:50:28

标签: php laravel search laravel-5 eloquent

我正在尝试修改使用Laravel的模板,我对这种语言很新。我正在尝试过滤搜索结果以匹配所有搜索过的字词。

例如,用户搜索" Red",搜索会返回所有红色结果。用户搜索"卡车",搜索返回所有卡车。但是如果用户搜索"红色卡车",则搜索返回"红色"搜索结果和"卡车"搜索结果。那里有红色汽车和红色自行车,还有黄色卡车......但我只想要" Red Trucks"要显示。如果结果中没有保存其中一个标签,我就不希望它显示出来。目前它只需要包含一个标签并显示它。

我知道我需要修改"其中"和" orwhere"标签的部分'标签'并且可能会将它们更改为' =',但我无法通过我的反复试验来解决问题。

作为参考,上传的红色卡车照片将在phpmyadmin的标签字段中显示以下内容:红色,降低,s10,卡车,光泽,自定义,条纹

所以搜索" Red Truck"应该返回此图片,而不是包含任何" red" "汽车"

搜索文本框的名称为" q"和id =" srch-term" 。搜索" Red Truck"会在浏览器中显示/搜索?q =红色+卡车。

基本代码:

public function search($search, $timeframe = null)
{
    $extends = explode(' ', $search);
    $images = $this->posts($timeframe)->Where('tags', 'LIKE', '%' . $search . '%')
        ->whereNull('deleted_at')->whereNotNull('approved_at')->orderBy('approved_at', 'desc');

    foreach ($extends as $extend) {
            $images->orWhere('tags', 'LIKE', '%' . $extend . '%')->whereNotNull('approved_at')->whereNull('deleted_at');
    }

    return $images = $images->with('user', 'comments', 'favorites')->whereNotNull('approved_at')->whereNull('deleted_at')->paginate(perPage());
}

2 个答案:

答案 0 :(得分:1)

想出来了!

Public function search($search, $timeframe = null)
{
$extends = explode(' ', $search);
$images = $this->posts($timeframe)
             ->whereNull('deleted_at')->whereNotNull('approved_at') 
             ->orderBy('approved_at', 'desc');

$images->where(function($q) use ($extends) {
   foreach ($extends as $extend) {
       $q->Where('tags', 'LIKE', '%' . $extend . '%');
   }
});

return $images->with('user', 'comments', 'favorites')->paginate(perPage());
}

答案 1 :(得分:0)

你很好。只需在您的查询中使用whereIn,就像这样。

|       Date | Total | CummlativeTotal |
|------------|-------|-----------------|
| 2017-12-25 |     3 |               3 |
| 2017-12-26 |     2 |               5 |
| 2017-12-27 |     2 |               7 |

更新的答案

$images->whereCategoryId($categoryId)->whereIn('tags', $extends)->whereNotNull('approved_at')->whereNull('deleted_at');