laravel / scout

Laravel Scout provides a driver based solution to searching your Eloquent models.
https://laravel.com/docs/scout
MIT License
1.55k stars 330 forks source link

Typesense integration malforms boolean filters into integers. #873

Open bredmor opened 15 hours ago

bredmor commented 15 hours ago

Scout Version

10.11.3

Scout Driver

Typesense

Laravel Version

10.48.22

PHP Version

8.2.23

Database Driver & Version

No response

SDK Version

No response

Meilisearch CLI Version

No response

Description

While searching with a boolean filter (e.g. Model::search($query)->where('myFilter', true)->get), TypesenseEngine.php will transform the true value into 1 before passing it into the typesense-php SDK to be sent to the Typsense server. This results in a Typesense\Exceptions\RequestMalformed exception with a message of "Value of filter field myFilter must be true or false."

I believe I have narrowed the issue down to the method TypesenseEngine::filters(), specifically the calls to Collection::map() here:

protected function filters(Builder $builder): string
    {
        $whereFilter = collect($builder->wheres)
            ->map(fn ($value, $key) => $this->parseWhereFilter($value, $key))
            ->values()
            ->implode(' && ');

        $whereInFilter = collect($builder->whereIns)
            ->map(fn ($value, $key) => $this->parseWhereInFilter($value, $key))
            ->values()
            ->implode(' && ');

        return $whereFilter.(
            ($whereFilter !== '' && $whereInFilter !== '') ? ' && ' : ''
        ).$whereInFilter;
    }

Looking at the data within the Builder instance passed into this function, I see boolean values for the filter parameters. However when I look at the $value parameter passed into parseWhereFilter() I see a 1 where the Builder contained true.

Steps To Reproduce

  1. Install and configure Laravel Scout in a Laravel Project
  2. Configure a searchable model with a boolean field
  3. Sync any models necessary
  4. Attempt to perform a search on that model, filtering the boolean field to true
  5. Observe a RequestMalformed exception.
bredmor commented 14 hours ago

Thinking on this, I wonder if it might be undesired functionality for the Collection/Array map() function to do this in general, or if it's expected and understood.

If the latter, I would be happy to write a PR to fix this issue for scout.

tharropoulos commented 14 hours ago

I'll investigate as soon as possible and report back