Красноречивая фильтрация с несколькими параметрами - PullRequest
0 голосов
/ 24 мая 2018

Я пишу функцию поиска, которая в основном просматривает несколько таблиц.

Структура и отношения БД следующие:

`users`
id
name
user_type_id

`user_type`
id
type

`user_nicknames`
id
user_id
nickname

Модель пользователя имеет \Illuminate\Database\Eloquent\Relations\BelongsTo отношение с user_type

и отношение \Illuminate\Database\Eloquent\Relations\HasMany к user_nicknames

Я пытаюсь найти поиск по определенному критерию поиска, который можно найти либо в таблице users, либо в user_nicknames

В данный момент происходит сбой:

 $user = $this->user->newQuery();

 $user->whereHas('userType', function ($query) use ($filters) {
                $query->where('type', $filters['type']);

        });

$user->whereHas('userNickName', function ($query) use ($searchTerm) {
            $query->where('custom_title', 'like', '%'.$nickname.'%');
        });

Обратите внимание, что я предпочел бы использовать красноречивые связи для этого, а не для нескольких объединений.

Любойидеи?

1 Ответ

0 голосов
/ 24 мая 2018

В вашей пользовательской модели добавьте эти функции:

public function scopeUserTypeFilter($query, $filters)
{
    return $query->whereHas('user_type', function ($query) use ($filters) {
            $query->where('type', $filters['type']);
    });
}
public function scopeNicknameFilter($query, $nickname)
{
    return $query->whereHas('user_nick_name', function ($query) use ($searchTerm) {
        $query->where('custom_title', 'like', '%'.$nickname.'%');
    });
}

Затем вы можете использовать их на вашем контроллере:

public function search(Request $reqeust)
{
    $users = User::where(function ($query) use ($request) {
        return $query->when($request->filled('s'), function($query) use ($request) {
            return $query->nicknameFilter($request->s);
     });
    })->where(function ($query) use ($request) {
        return $query->when($request->filled('userType'), function($query) use ($request){
            return $query->userTypeFilter($request->userType);
    });
    })->get();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...