Laravel是否有一种方法可以优化跨多个领域的搜索?

3npbholx  于 2023-06-30  发布在  其他
关注(0)|答案(2)|浏览(79)

我有一个标题,描述和作者字段的搜索,有没有一种方法可以使它更快或缩短代码?

public function index(Request $request)
    {
        $queryStr = $request->query('search');

        $games = Game::withTrashed()
            ->with('user')
            ->where('title', 'like', '%' . $queryStr . '%')
            ->orWhere('description', 'like', '%' . $queryStr . '%')
            ->orWhereHas('user', function ($query) use ($queryStr) {
                $query->where('username', 'like', '%' . $queryStr . '%');
            })
            ->get();

        return view('gameList', compact('games'));
    }

这段代码工作,但我不喜欢每个字段都有必要重复"'like', '%' . $queryStr . '%'",有谁知道这是否可以做得更快,没有重复

njthzxwz

njthzxwz1#

1.在app目录中创建一个名为helpers.php的文件。
1.添加此代码
if(!function_exists('like ')){ function like($query){ return '%'.$query.'%';您的位置
1.在composer.json文件中添加“autoload”:
{“files”:[“app/helpers.php”] },

  1. composer 转储自动加载
    1.$queryStr = like($request->query('search '));
    1.替换“%”。$queryStr .$queryStr上的“%”
7eumitmz

7eumitmz2#

首先,我建议您保持代码原样。这是一种标准的方式,任何laravel开发人员都会在第一眼就理解它。
话虽如此,您正在寻找雄辩的宏,而您的确切问题由天才Freek货车der赫尔滕在https://freek.dev/1182-searching-models-using-a-where-like-query-in-laravel中描述
总之,您可以在“AppServiceProvider”的 Boot 方法中定义宏:

Builder::macro('whereLike', function(string $attribute, string $searchTerm) {
   return $this->orWhere($attribute, 'LIKE', "%{$searchTerm}%");
});

然后你可以像这样使用它:

User::query()
   ->whereLike('name', $searchTerm)
   ->get();

请阅读这篇博客文章,它深入介绍了如何优化和使用这个宏。

相关问题