Laravel匹配多个搜索词

问题描述 投票:1回答:2

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

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

我知道我需要修改“标签”的“where”和“orwhere”部分,并可能将它们更改为“=”,但我无法通过我的试验和错误来完成它。

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

因此,搜索“红色卡车”应返回此图像,而不包括任何“红色”“汽车”。

搜索文本框的名称为“q”,id =“srch-term”。搜索“红色卡车”将在浏览器中显示/搜索?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());
}
php laravel search laravel-5 eloquent
2个回答
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());
}

0
投票

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

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

更新的答案

public function search($search, $category = null, $timeframe = null)
{
    if ($category)
        $categoryId = $this->category->whereSlug($category)->first();

    $images = $this->posts($category, $timeframe)->with('user', 'comments', 'favorites')->whereNotNull('approved_at')->whereNull('deleted_at');

    if (isset($categoryId))
        $images->whereCategoryId($categoryId);

    $images->whereIn('tags', explode(' ', $search));

    return $images->orderBy('approved_at', 'desc')->paginate(perPage());
}
© www.soinside.com 2019 - 2024. All rights reserved.