我正在尝试修改使用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());
}
弄清楚了!
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());
}
你很好。只需要在你的查询中使用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());
}