Нужен более быстрый красноречивый поисковый запрос - PullRequest
0 голосов
/ 27 октября 2018

У меня есть две модели: пользователь и актер с отношением один к одному.Таблица пользователя содержит столбец с именем, адресом электронной почты (уникальный) и типом пользователя (актер / режиссер).Я хочу получить все детали актеров.Для этого я использую следующий код:

$ 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 минут.

Пожалуйста, помогите мне с возможными решениями.

Заранее спасибо.

...