Postgres и Laravel поисковый запрос - PullRequest
0 голосов
/ 27 марта 2020

У меня есть запрос на несколько поисков, проблема в одном из них, я получаю правильный результат, но в сочетании с остальными я получаю неправильный ответ для остальных полей.

//I get the correct result for first if, but the second one returns a wrong response.
        if ($request->has('search_fullname') && !is_null($request->search_fullname)) {
            $query->where('full_name', 'ILIKE', $request->search_fullname . '%')
                ->orWhere('full_name', 'ILIKE', '% ' . $request->search_fullname . '%');
        }

        if ($request->has('search_gender') && !is_null($request->search_gender)) {
            $query->where('gender', '=', $request->search_gender);
        } //like this if I have many more, the problem is strict from the first one

1 Ответ

1 голос
/ 27 марта 2020

Прежде всего, когда вы применяете where(A)->orWhere(B) для запроса и применения нового метода where(C)..., он становится:

where (A and C and D ...) or B

, вам нужно изменить его на

where (A or B) and C and D ....

поэтому первый запрос должен быть таким:

if ($request->has('search_fullname') && !is_null($request->search_fullname)) {
    $query->where(function($q) {
          $q->where('full_name', 'ILIKE', $request->search_fullname . '%')
            ->orWhere('full_name', 'ILIKE', '% ' . $request->search_fullname . '%');
    })       
}

Во-вторых, вы можете использовать , когда в качестве метода условия, он будет применяться к запросу только тогда, когда поле запроса не пусто .

$query->when($request->input('search_fullname'), function($q) use ($request) {
    $q->where(function($q) {
        $q->where('full_name', 'ILIKE', $request->search_fullname.'%')
          ->orWhere('full_name', 'ILIKE', '% ' . $request->search_fullname . '%');
    });   
})->when($request->input('search_gender'), function($q) use ($request) {
    $q->where('gender', '=', $request->search_gender);
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...