我想获取名称中带有单词,标签之一或类别的所有图像

时间:2018-11-03 22:32:02

标签: php laravel eloquent

我正在尝试向我的网站添加搜索功能,并且一直在修改我需要执行的雄辩查询。目前,我已经进行了3个查询,每个查询都获得了满足特定条件的图像,但是,我不确定如何将其组合为1个查询,以吐出所有符合一个,两个或所有条件的图像。

$images = Image::where('name', 'like', '%'.$query.'%')->get();

此查询将获取名称与所搜索单词相似的所有图像。

$images = Image::whereHas('tags', function($q) use ($query) {
        return $q->where('name', 'like', '%'.$query.'%');
    })->orderBy('created_at', 'desc')->get();

此查询将获取所有标签与搜索到的单词相似的图像。

$images = Image::whereHas('category', function($q) use ($query) {
            return $q->where('name', 'like', '%'.$query.'%');
        })->orderBy('created_at', 'desc')->get();

最后,此查询将获得所有类别与所搜索单词相似的图像。

public function search($query){

    $images = Image::where('name', 'like', '%'.$query.'%')->get();

    $images = Image::whereHas('tags', function($q) use ($query) {
        return $q->where('name', 'like', '%'.$query.'%');
    })->orderBy('created_at', 'desc')->get();

    $images = Image::whereHas('category', function($q) use ($query) {
        return $q->where('name', 'like', '%'.$query.'%');
    })->orderBy('created_at', 'desc')->get();

    return view('search', ['images' => $images]);

}

这是创建搜索功能的正确方法吗?我可以做些什么来进一步增强它?我个人可能会监督一些明显的问题吗?我会感激所有提示和技巧,因为我认为搜索功能对像我这样的CRUD应用程序很重要。

1 个答案:

答案 0 :(得分:1)

将约束合并到单个查询中:

$images = Image::where('name', 'like', '%'.$query.'%')
    ->orWhereHas('tags', function($q) use ($query) {
        return $q->where('name', 'like', '%'.$query.'%');
    })->orWhereHas('category', function($q) use ($query) {
        return $q->where('name', 'like', '%'.$query.'%');
    })->latest()
    ->get();

latest()等效于orderBy('created_at', 'desc')