From 4736f9bac1db7c179486dd96e9d4e8ad42170130 Mon Sep 17 00:00:00 2001 From: Vincent Auger Date: Mon, 27 Feb 2023 15:43:11 -0400 Subject: [PATCH] search both columns in journal instead of fuzzy search - too many journals for Fuzzy --- app/Filters/MultiColumnFilter.php | 38 +++++++++++++++++++ app/Http/Resources/AuthorResource.php | 10 ++--- app/Queries/JournalListQuery.php | 4 +- phpstan.neon | 2 +- .../Journal/components/JournalSelect.vue | 5 ++- 5 files changed, 50 insertions(+), 9 deletions(-) create mode 100644 app/Filters/MultiColumnFilter.php diff --git a/app/Filters/MultiColumnFilter.php b/app/Filters/MultiColumnFilter.php new file mode 100644 index 00000000..48e3e1cc --- /dev/null +++ b/app/Filters/MultiColumnFilter.php @@ -0,0 +1,38 @@ +columns = $columns; + } + + public function __invoke(Builder $query, $value, string $property) + { + $attributes = $this->columns; + + // is database engine postgresql? if so, use ILIKE as it is case insensitive + $like = config('database.default') === 'pgsql' ? 'ILIKE' : 'LIKE'; + + $query->where(function (Builder $query) use ($attributes, $value, $like) { + foreach (Arr::wrap($attributes) as $attribute) { + $query->orWhere(function ($query) use ($attribute, $value, $like) { + $query->orWhere($attribute, $like, "%{$value}%"); + }); + } + }); + + return $this; + } +} diff --git a/app/Http/Resources/AuthorResource.php b/app/Http/Resources/AuthorResource.php index 5338719c..e5a816fb 100644 --- a/app/Http/Resources/AuthorResource.php +++ b/app/Http/Resources/AuthorResource.php @@ -5,11 +5,11 @@ use Auth; use Illuminate\Http\Resources\Json\JsonResource; -/* -* Resource for Author model - -* @extends JsonResource<\App\Models\Author> -*/ +/** + * Resource for Author model. + * + * @extends JsonResource<\App\Models\Author> + */ class AuthorResource extends JsonResource { /** diff --git a/app/Queries/JournalListQuery.php b/app/Queries/JournalListQuery.php index 3758504b..dcd18c75 100644 --- a/app/Queries/JournalListQuery.php +++ b/app/Queries/JournalListQuery.php @@ -2,7 +2,7 @@ namespace App\Queries; -use App\Filters\FuzzyFilter; +use App\Filters\MultiColumnFilter; use App\Models\Journal; use Spatie\QueryBuilder\AllowedFilter; use Spatie\QueryBuilder\QueryBuilder; @@ -20,7 +20,7 @@ public function __construct() AllowedFilter::exact('id'), AllowedFilter::partial('title_en'), AllowedFilter::partial('title_fr'), - AllowedFilter::custom('search', new FuzzyFilter('title_en', 'title_fr')), + AllowedFilter::custom('search', new MultiColumnFilter('title_en', 'title_fr')), AllowedFilter::scope('dfo_series'), ]); } diff --git a/phpstan.neon b/phpstan.neon index b05a6c2a..946efad5 100644 --- a/phpstan.neon +++ b/phpstan.neon @@ -16,4 +16,4 @@ parameters: # excludePaths: # - ./*/*/FileToBeExcluded.php # -# checkMissingIterableValueType: false \ No newline at end of file +# checkMissingIterableValueType: false diff --git a/resources/src/models/Journal/components/JournalSelect.vue b/resources/src/models/Journal/components/JournalSelect.vue index a1bdd54f..1fabc770 100644 --- a/resources/src/models/Journal/components/JournalSelect.vue +++ b/resources/src/models/Journal/components/JournalSelect.vue @@ -87,7 +87,10 @@ onMounted(async () => { } }); -const filterJournals = async (val: string, update, abort) => { +const filterJournals = async ( + val: string, + update: (arg: () => Promise) => void +) => { lastSearchTerm.value = val; update(async () => { if (val !== '') {