Мой фильтр области не работает, я получаю результат выбора * вместо фильтрации

avatar
Ruth Davis
9 августа 2021 в 04:36
151
1
0

Я работаю над небольшим проектом, используя Laravel и Vuejs. Я пытаюсь сделать простой фильтр возрастов

Я отправляю и получаю правильно свои параметры GET (я перепроверил), я получаю тот же результат, так как отправляю разные значения.

похоже, что моя функция scopeWithFilters не работает, потому что я использовал функцию toSql для просмотра запроса, и результат был select * from users, что означает, что моя функция области видимости не работает.

Это моя функция области видимости:

public function scopeWithFilters($query, $minAge=Null, $maxAge=Null){
    $query->when(is_int($minAge), function($query) use ($minAge){
        $query->where('birthday_year', '<=', date('Y') - $minAge);
    
    })->when(is_int($maxAge), function($query) use ($maxAge){
        $query->where('birthday_year', '>=', date('Y') - $maxAge);
    
    });

    return $query;
}

Это функция моего контроллера:

public function filter(Request $request){

        $query = User::WithFilters(
            $request->input('minAge'),
            $request->input('maxAge')
        )->get();

        return UserResource::collection($query);
    }

после выполнения ->toSql() чтобы увидеть запрос:

select * from users
Источник

Ответы (1)

avatar
matiaslauriti
9 августа 2021 в 04:57
2

PHP чувствителен к регистру, поэтому вместо User::WithFilters( попробуйте User::withFilters(. См. документацию.

Кроме того, вы можете получить "чистый код", если обновите свои фильтры до этого:

public function scopeWithFilters($query, int $minAge=null, int $maxAge=null){
    return $query->when($minAge, function($query) use ($minAge) {
        $query->where('birthday_year', '<=', date('Y') - $minAge);
    })
    ->when($maxAge, function($query) use ($maxAge) {
        $query->where('birthday_year', '>=', date('Y') - $maxAge);
    });
}

Если вы используете PHP 8+, мы могли бы сократить ваш код до этого (имейте в виду, что в данном случае он визуален, но, возможно, он также будет более удобочитаемым для вас):

use Illuminate\Database\Eloquent\Builder; // Add this on top with your other USEs

public function scopeWithFilters(Builder $query, int $minAge = null, int $maxAge = null)
{
    return $query->when(
        $minAge,
        fn(Builder $query) => $query->where('birthday_year', '<=', date('Y') - $minAge)
    )
    ->when(
        $maxAge,
        fn(Builder $query) => $query->where('birthday_year', '>=', date('Y') - $maxAge)
    );
}