需要更快的口才搜索查询

时间:2018-10-27 15:03:12

标签: eloquent laravel-5.6 laravel-query-builder

我有两个模型用户和演员,它们之间存在一对一的关系。用户表具有名称,电子邮件(唯一)和用户类型(演员/制片人)列。 我想了解所有演员的详细信息。为此,我正在使用以下代码。

$ actorlist = Actor :: with('user')-> paginate(15);

但是当演员人数更多时,这非常慢。

对于搜索功能,我也在使用以下代码。

*$actorlist = Actor::join('users', function ($join) {
            $join->on('actors.user_id', '=', 'users.id');
        })->newQuery();
        if ($request->has('has_voice')) {
            $actorlist->has('voices');
        }
        if ($request->has('has_video')) {
            $actorlist->has('shows');
        }
        if ($request->has('has_imdb')) {
            $actorlist->where('imdb_link', '!=', null);
        }
        if ($request->has('hair_colour') && $request->input('hair_colour') != 'any hair colour') {
            $actorlist->where('hair_colour', 'LIKE', $request->input('hair_colour'));
        }
        if ($request->has('gender') && $request->input('gender') != 'any gender') {
            $actorlist->where('gender', 'LIKE', $request->input('gender'));
        }
        if ($request->has('ethnicity') && $request->input('ethnicity') != 'any ethnicity') {
            $actorlist->where('ethnicity', 'LIKE', "%{$request->input('ethnicity')}%");
        }
        if ($request->has('eye_colour') && $request->input('eye_colour') != 'any eye colour') {
            $actorlist->where('eye_colour', 'LIKE', $request->input('eye_colour'));
        }
        if ($request->has('hair_colour') && $request->input('hair_colour') != 'any hair colour') {
            $actorlist->where('hair_colour', 'LIKE', $request->input('hair_colour'));
        }
        if ($request->has('min_age')) {
            $actorlist->where('min_age', '>=', $request->input('min_age'));
        }
        if ($request->has('max_age')) {
            $actorlist->where('max_age', '<=', $request->input('max_age'));
        }
        if ($request->has('min_height') && $request->has('max_height')) {
            $actorlist->whereBetween('height', [floatval($request->input('min_height')), floatval($request->input('max_height'))]);
        }
        if($request->has('name') && $request->input('name') != ''){
            $keywords = $searchValues = preg_split('/\s+/', $request->input('name'), -1, PREG_SPLIT_NO_EMPTY);
            $actorlist->where(function ($q) use ($keywords) {
                foreach ($keywords as $value) {
                    $q->orWhere('users.first_name', 'like', "%{$value}%");
                    $q->orWhere('users.last_name', 'like', "%{$value}%");
                }
            });
        }
        $actorlist = $actorlist->paginate(15);*

加载时间将近5分钟。

请帮助我提供可行的解决方案。

谢谢。

0 个答案:

没有答案