From c840a1b7ad24428daf8bde6209cba84f44e70dfa Mon Sep 17 00:00:00 2001 From: mattdfloyd Date: Mon, 25 Sep 2017 16:09:19 -0400 Subject: [PATCH 01/35] Implement mapIds() --- src/Engines/MySQLEngine.php | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/Engines/MySQLEngine.php b/src/Engines/MySQLEngine.php index f3a9e39..9b65a38 100644 --- a/src/Engines/MySQLEngine.php +++ b/src/Engines/MySQLEngine.php @@ -27,8 +27,17 @@ public function delete($models) { } + /** + * Pluck and return the primary keys of the given results. + * + * @param mixed $results + * @return \Illuminate\Support\Collection + */ public function mapIds($results) { + return collect($results['results'])->map(function ($result) { + return $result->getKey(); + }); } /** From 6d355d02473a71bcdb4395baaca36c6179f603c9 Mon Sep 17 00:00:00 2001 From: Mochammad Masbuchin Date: Thu, 2 Nov 2017 18:25:19 +0700 Subject: [PATCH 02/35] Implement callback --- src/Engines/MySQLEngine.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/Engines/MySQLEngine.php b/src/Engines/MySQLEngine.php index f3a9e39..89344db 100644 --- a/src/Engines/MySQLEngine.php +++ b/src/Engines/MySQLEngine.php @@ -57,6 +57,10 @@ public function search(Builder $builder) $model = $builder->model; $query = $model::whereRaw($whereRawString, $params); + if($builder->callback){ + $query = call_user_func($builder->callback, $query, $this); + } + $result['count'] = $query->count(); if (property_exists($builder, 'orders') && !empty($builder->orders)) { From 8891e643c85e603251cf240b9d0dc8a8d4d1684e Mon Sep 17 00:00:00 2001 From: Ozan Kurt Date: Thu, 16 Aug 2018 22:03:50 +0300 Subject: [PATCH 03/35] Laravel 5.7 Released --- composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.json b/composer.json index 9635a1b..9255b88 100644 --- a/composer.json +++ b/composer.json @@ -15,7 +15,7 @@ "minimum-stability": "dev", "require": { "php": ">=5.6.4", - "laravel/framework": "5.3.*|5.4.*|5.5.*|5.6.*", + "laravel/framework": "5.3.*|5.4.*|5.5.*|5.6.*|5.7.*", "laravel/scout": "^2.0|^3.0|^4.0" }, "autoload": { From d243de06ca87e763d946f76aa694f8ec3e9f4451 Mon Sep 17 00:00:00 2001 From: Manash Sonowal Date: Tue, 16 Oct 2018 16:05:59 +0530 Subject: [PATCH 04/35] Update composer.json --- composer.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/composer.json b/composer.json index 9255b88..0a1e2c9 100644 --- a/composer.json +++ b/composer.json @@ -15,8 +15,8 @@ "minimum-stability": "dev", "require": { "php": ">=5.6.4", - "laravel/framework": "5.3.*|5.4.*|5.5.*|5.6.*|5.7.*", - "laravel/scout": "^2.0|^3.0|^4.0" + "laravel/framework": "5.3.*|5.4.*|5.5.*|5.6.*|5.7.*|5.8.*", + "laravel/scout": "^5.0" }, "autoload": { "psr-4": { From 6af05ef12e4c618d41b27253401a5de6f76a4eca Mon Sep 17 00:00:00 2001 From: Manash Sonowal Date: Tue, 16 Oct 2018 16:08:04 +0530 Subject: [PATCH 05/35] Update MySQLEngine.php --- src/Engines/MySQLEngine.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Engines/MySQLEngine.php b/src/Engines/MySQLEngine.php index f3a9e39..348fba0 100644 --- a/src/Engines/MySQLEngine.php +++ b/src/Engines/MySQLEngine.php @@ -98,12 +98,12 @@ public function paginate(Builder $builder, $perPage, $page) /** * Map the given results to instances of the given model. * - * @param mixed $results + * @param Laravel\Scout\Builder $builder * @param \Illuminate\Database\Eloquent\Model $model * * @return Collection */ - public function map($results, $model) + public function map(Builder $builder, $model) { return $results['results']; } From 7450be64c2f8c3105b2f79c9b5501a05cd085516 Mon Sep 17 00:00:00 2001 From: DariusIII Date: Tue, 16 Oct 2018 23:23:34 +0200 Subject: [PATCH 06/35] Add missing $results variable to map function declaration --- src/Engines/MySQLEngine.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Engines/MySQLEngine.php b/src/Engines/MySQLEngine.php index b198ecb..5c4cbbc 100644 --- a/src/Engines/MySQLEngine.php +++ b/src/Engines/MySQLEngine.php @@ -112,7 +112,7 @@ public function paginate(Builder $builder, $perPage, $page) * * @return Collection */ - public function map(Builder $builder, $model) + public function map(Builder $builder, $results, $model) { return $results['results']; } From 26de6892a743346265eb81cbf7ac7082575dbbf8 Mon Sep 17 00:00:00 2001 From: Bob Olde Hampsink Date: Wed, 21 Nov 2018 09:09:47 +0100 Subject: [PATCH 07/35] Added support for Scout 6 and Lumen This adds support for Scout 6.x and removes the hard dependency on laravel/framework so that it can also be used with laravel/lumen-framework. Using laravel is implied anyway by using laravel/scout. --- composer.json | 5 ++--- src/Engines/MySQLEngine.php | 11 +++++++++++ 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/composer.json b/composer.json index 0a1e2c9..07b0b1f 100644 --- a/composer.json +++ b/composer.json @@ -14,9 +14,8 @@ ], "minimum-stability": "dev", "require": { - "php": ">=5.6.4", - "laravel/framework": "5.3.*|5.4.*|5.5.*|5.6.*|5.7.*|5.8.*", - "laravel/scout": "^5.0" + "php": ">=7.0", + "laravel/scout": "^6.0" }, "autoload": { "psr-4": { diff --git a/src/Engines/MySQLEngine.php b/src/Engines/MySQLEngine.php index ab58228..91c22eb 100644 --- a/src/Engines/MySQLEngine.php +++ b/src/Engines/MySQLEngine.php @@ -133,6 +133,17 @@ public function getTotalCount($results) return $results['count']; } + /** + * Flush all of the model's records from the engine. + * + * @param \Illuminate\Database\Eloquent\Model $model + * + * @return void + */ + public function flush($model) + { + } + protected function shouldNotRun($builder) { return strlen($builder->query) < config('scout.mysql.min_search_length'); From 1989fafeb2a3fe518f9e8459c7d75f208fcac72a Mon Sep 17 00:00:00 2001 From: Bob Olde Hampsink Date: Wed, 21 Nov 2018 11:18:07 +0100 Subject: [PATCH 08/35] Improve Lumen support --- src/Engines/Modes/Mode.php | 2 +- src/Providers/MySQLScoutServiceProvider.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Engines/Modes/Mode.php b/src/Engines/Modes/Mode.php index 6b04581..f81b5c2 100644 --- a/src/Engines/Modes/Mode.php +++ b/src/Engines/Modes/Mode.php @@ -13,7 +13,7 @@ abstract class Mode public function __construct() { - $this->modelService = resolve(ModelService::class); + $this->modelService = app(ModelService::class); } abstract public function buildWhereRawString(Builder $builder); diff --git a/src/Providers/MySQLScoutServiceProvider.php b/src/Providers/MySQLScoutServiceProvider.php index 6f85352..c23f2ff 100644 --- a/src/Providers/MySQLScoutServiceProvider.php +++ b/src/Providers/MySQLScoutServiceProvider.php @@ -24,7 +24,7 @@ public function boot() } $this->app->make(EngineManager::class)->extend('mysql', function () { - return new MySQLEngine(resolve(ModeContainer::class)); + return new MySQLEngine(app(ModeContainer::class)); }); } From f9999690550624ccceef7eb374d76fb2d63d8b49 Mon Sep 17 00:00:00 2001 From: Michel Bardelmeijer Date: Mon, 11 Mar 2019 10:09:24 +0100 Subject: [PATCH 09/35] Add support for laravel/scout 7.0 --- composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.json b/composer.json index 07b0b1f..7f0a336 100644 --- a/composer.json +++ b/composer.json @@ -15,7 +15,7 @@ "minimum-stability": "dev", "require": { "php": ">=7.0", - "laravel/scout": "^6.0" + "laravel/scout": "~6.0" }, "autoload": { "psr-4": { From 4e598e2e49289b544ed7eb7a8084290a912defca Mon Sep 17 00:00:00 2001 From: Michel Bardelmeijer Date: Mon, 11 Mar 2019 10:12:43 +0100 Subject: [PATCH 10/35] Fix laravel/scout constraint --- composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.json b/composer.json index 7f0a336..67bdf1e 100644 --- a/composer.json +++ b/composer.json @@ -15,7 +15,7 @@ "minimum-stability": "dev", "require": { "php": ">=7.0", - "laravel/scout": "~6.0" + "laravel/scout": "~6.0|~7.0" }, "autoload": { "psr-4": { From 9212a5068e8e6be4d741e6fb7e2191eac632a3be Mon Sep 17 00:00:00 2001 From: Vladimir Morozov Date: Thu, 14 Mar 2019 12:44:41 +0200 Subject: [PATCH 11/35] fixed where null issue --- src/Engines/Modes/Mode.php | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/Engines/Modes/Mode.php b/src/Engines/Modes/Mode.php index f81b5c2..8aa57ef 100644 --- a/src/Engines/Modes/Mode.php +++ b/src/Engines/Modes/Mode.php @@ -35,9 +35,12 @@ protected function buildWheres(Builder $builder) $operator = $parsedWhere[1]; $value = $parsedWhere[2]; - $this->whereParams[$field] = $value; - - $queryString .= "$field $operator ? AND "; + if ($value !== null) { + $this->whereParams[$field] = $value; + $queryString .= "$field $operator ? AND "; + } else { + $queryString .= "$field IS NULL AND "; + } } return $queryString; From 221c3809468ea74185bc0e3960d7e55e23ae4be9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20M=C3=A4rz?= Date: Wed, 19 Jun 2019 09:45:17 +0200 Subject: [PATCH 12/35] Error gots thrown if a non Model ist in app/ folder I know it's not the nicest fix but maybe someone comes up with a better solution. I had my helpers.php file in app/ and an error got thrown cause $classes[0] wasn't set. --- src/helpers.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/helpers.php b/src/helpers.php index 25b1f09..c2a166f 100644 --- a/src/helpers.php +++ b/src/helpers.php @@ -94,6 +94,8 @@ function getClassNameFromFile($filePathName) $classes[] = $class_name; } } - + if (!isset($classes[0]) { + return 'no_class_found_in_file'; + } return $classes[0]; } From b64f3bc3bb4f50e3d35ccb262b9be9d7a9016a6a Mon Sep 17 00:00:00 2001 From: Vladimir Morozov Date: Fri, 6 Sep 2019 09:26:52 +0300 Subject: [PATCH 13/35] added laravel ^6.0 support --- .gitignore | 2 ++ src/Providers/MySQLScoutServiceProvider.php | 5 +++-- src/helpers.php | 2 +- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/.gitignore b/.gitignore index 9f11b75..ac85e9c 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,3 @@ .idea/ +composer.lock +/vendor diff --git a/src/Providers/MySQLScoutServiceProvider.php b/src/Providers/MySQLScoutServiceProvider.php index c23f2ff..42e7343 100644 --- a/src/Providers/MySQLScoutServiceProvider.php +++ b/src/Providers/MySQLScoutServiceProvider.php @@ -2,6 +2,7 @@ namespace Yab\MySQLScout\Providers; +use Illuminate\Support\Str; use Yab\MySQLScout\Engines\Modes\ModeContainer; use Illuminate\Support\ServiceProvider; use Laravel\Scout\EngineManager; @@ -43,8 +44,8 @@ public function register() $this->app->singleton(ModeContainer::class, function ($app) { $engineNamespace = 'Yab\\MySQLScout\\Engines\\Modes\\'; - $mode = $engineNamespace.studly_case(strtolower(config('scout.mysql.mode'))); - $fallbackMode = $engineNamespace.studly_case(strtolower(config('scout.mysql.min_fulltext_search_fallback'))); + $mode = $engineNamespace.Str::studly(strtolower(config('scout.mysql.mode'))); + $fallbackMode = $engineNamespace.Str::studly(strtolower(config('scout.mysql.min_fulltext_search_fallback'))); return new ModeContainer(new $mode(), new $fallbackMode()); }); diff --git a/src/helpers.php b/src/helpers.php index c2a166f..94104de 100644 --- a/src/helpers.php +++ b/src/helpers.php @@ -94,7 +94,7 @@ function getClassNameFromFile($filePathName) $classes[] = $class_name; } } - if (!isset($classes[0]) { + if (!isset($classes[0])) { return 'no_class_found_in_file'; } return $classes[0]; From 3686b2d8bdaaf5a5b4ea1cee9df900db06673730 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aur=C3=A9lien=20MENDES?= Date: Wed, 21 Aug 2019 11:31:59 +0200 Subject: [PATCH 14/35] Add relevance attribute to Models if Mode is FullText compatible (NATURAL or BOOLEAN) --- src/Engines/Modes/Boolean.php | 7 +++++++ src/Engines/Modes/NaturalLanguage.php | 7 +++++++ src/Engines/MySQLEngine.php | 4 ++++ 3 files changed, 18 insertions(+) diff --git a/src/Engines/Modes/Boolean.php b/src/Engines/Modes/Boolean.php index 6da0a16..ef5f5e6 100644 --- a/src/Engines/Modes/Boolean.php +++ b/src/Engines/Modes/Boolean.php @@ -20,6 +20,13 @@ public function buildWhereRawString(Builder $builder) return $queryString; } + public function buildSelectColumns(Builder $builder) + { + $indexFields = implode(',', $this->modelService->setModel($builder->model)->getFullTextIndexFields()); + + return "*, MATCH($indexFields) AGAINST(? IN NATURAL LANGUAGE MODE) AS relevance"; + } + public function buildParams(Builder $builder) { $this->whereParams[] = $builder->query; diff --git a/src/Engines/Modes/NaturalLanguage.php b/src/Engines/Modes/NaturalLanguage.php index 63a1ab8..adf8178 100644 --- a/src/Engines/Modes/NaturalLanguage.php +++ b/src/Engines/Modes/NaturalLanguage.php @@ -25,6 +25,13 @@ public function buildWhereRawString(Builder $builder) return $queryString; } + public function buildSelectColumns(Builder $builder) + { + $indexFields = implode(',', $this->modelService->setModel($builder->model)->getFullTextIndexFields()); + + return "*, MATCH($indexFields) AGAINST(? IN NATURAL LANGUAGE MODE) AS relevance"; + } + public function buildParams(Builder $builder) { $this->whereParams[] = $builder->query; diff --git a/src/Engines/MySQLEngine.php b/src/Engines/MySQLEngine.php index 91c22eb..fb0b12b 100644 --- a/src/Engines/MySQLEngine.php +++ b/src/Engines/MySQLEngine.php @@ -4,6 +4,7 @@ use Yab\MySQLScout\Engines\Modes\ModeContainer; use Illuminate\Database\Eloquent\Collection; +use Illuminate\Support\Facades\DB; use Laravel\Scout\Builder; use Laravel\Scout\Engines\Engine; @@ -65,6 +66,9 @@ public function search(Builder $builder) $model = $builder->model; $query = $model::whereRaw($whereRawString, $params); + if ($mode->isFullText()) { + $query = $query->selectRaw(DB::raw($mode->buildSelectColumns($builder)), $params); + } if($builder->callback){ $query = call_user_func($builder->callback, $query, $this); From b777fcbdd90e5d701ae1d31c1910e9d2e0815f54 Mon Sep 17 00:00:00 2001 From: tarreislam Date: Tue, 10 Mar 2020 16:49:55 +0100 Subject: [PATCH 15/35] Laravel 7 + Scout 8 support According to: https://github.com/laravel/scout/blob/8.x/UPGRADE.md --- composer.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/composer.json b/composer.json index 67bdf1e..49cb6f6 100644 --- a/composer.json +++ b/composer.json @@ -14,8 +14,8 @@ ], "minimum-stability": "dev", "require": { - "php": ">=7.0", - "laravel/scout": "~6.0|~7.0" + "php": ">=7.2", + "laravel/scout": "~6.0|~7.0|~8.0" }, "autoload": { "psr-4": { From 58fc9c665fd0bc4b56610db58cb197617e9344a3 Mon Sep 17 00:00:00 2001 From: Manash Sonowal Date: Fri, 16 Apr 2021 11:03:23 +0530 Subject: [PATCH 16/35] Addresses #98 --- src/Engines/MySQLEngine.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Engines/MySQLEngine.php b/src/Engines/MySQLEngine.php index fb0b12b..52e0759 100644 --- a/src/Engines/MySQLEngine.php +++ b/src/Engines/MySQLEngine.php @@ -67,7 +67,7 @@ public function search(Builder $builder) $model = $builder->model; $query = $model::whereRaw($whereRawString, $params); if ($mode->isFullText()) { - $query = $query->selectRaw(DB::raw($mode->buildSelectColumns($builder)), $params); + $query = $query->selectRaw(DB::raw($mode->buildSelectColumns($builder)), [$params[0]]); } if($builder->callback){ From f63480b201f0d94eb7267709e4673fc93409d113 Mon Sep 17 00:00:00 2001 From: Manash Sonowal Date: Fri, 16 Apr 2021 11:05:03 +0530 Subject: [PATCH 17/35] Update composer.json --- composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.json b/composer.json index 49cb6f6..31f7ccb 100644 --- a/composer.json +++ b/composer.json @@ -14,7 +14,7 @@ ], "minimum-stability": "dev", "require": { - "php": ">=7.2", + "php": "^7.2|^8.0", "laravel/scout": "~6.0|~7.0|~8.0" }, "autoload": { From 36c6b9971e838bb50626c62989c9ed32726aeaa8 Mon Sep 17 00:00:00 2001 From: Austin White Date: Wed, 24 Feb 2021 10:03:35 -0800 Subject: [PATCH 18/35] Support for MariaDB Driver --- src/Services/IndexService.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/Services/IndexService.php b/src/Services/IndexService.php index 0775c38..9c641ce 100644 --- a/src/Services/IndexService.php +++ b/src/Services/IndexService.php @@ -40,7 +40,8 @@ public function getAllSearchableModels($directories) $connectionName = $modelInstance->getConnectionName() !== null ? $modelInstance->getConnectionName() : config('database.default'); - $isMySQL = config("database.connections.$connectionName.driver") === 'mysql'; + $isMySQL = config("database.connections.$connectionName.driver") === 'mysql' || + config("database.connections.$connectionName.driver") === 'mariadb'; if ($isMySQL) { $searchableModels[] = $class; From af4bc229266f2e1b4ff74f13575e24cfaf91ed4a Mon Sep 17 00:00:00 2001 From: "Mr. Jingles" Date: Wed, 28 Oct 2020 09:03:59 +0100 Subject: [PATCH 19/35] adding default fallback option for model --- src/Contracts/AlwaysUseFallbackSearch.php | 11 +++++++++++ src/Engines/MySQLEngine.php | 17 ++++++++++++----- 2 files changed, 23 insertions(+), 5 deletions(-) create mode 100644 src/Contracts/AlwaysUseFallbackSearch.php diff --git a/src/Contracts/AlwaysUseFallbackSearch.php b/src/Contracts/AlwaysUseFallbackSearch.php new file mode 100644 index 0000000..f883027 --- /dev/null +++ b/src/Contracts/AlwaysUseFallbackSearch.php @@ -0,0 +1,11 @@ +selectRaw(DB::raw($mode->buildSelectColumns($builder)), [$params[0]]); } - if($builder->callback){ + if ($builder->callback) { $query = call_user_func($builder->callback, $query, $this); } @@ -141,10 +142,10 @@ public function getTotalCount($results) * Flush all of the model's records from the engine. * * @param \Illuminate\Database\Eloquent\Model $model - * + * * @return void */ - public function flush($model) + public function flush($model) { } @@ -153,9 +154,15 @@ protected function shouldNotRun($builder) return strlen($builder->query) < config('scout.mysql.min_search_length'); } + protected function fallbackSearchShouldBeUsedForModel($builder) + { + return $builder->model instanceof AlwaysUseFallbackSearch; + } + protected function shouldUseFallback($builder) { - return $this->mode->isFullText() && - strlen($builder->query) < config('scout.mysql.min_fulltext_search_length'); + return ($this->mode->isFullText() && + strlen($builder->query) < config('scout.mysql.min_fulltext_search_length')) || + $this->fallbackSearchShouldBeUsedForModel($builder); } } From a8f1685b5fd7ab22173dae9ebedbdc4913730eb6 Mon Sep 17 00:00:00 2001 From: Konstantin Duczek Date: Sun, 23 Aug 2020 12:11:10 +0200 Subject: [PATCH 20/35] add some testing scaffolding --- .editorconfig | 8 ++++++++ .github/workflows/ci.yml | 15 +++++++++++++++ .gitignore | 1 + CONTRIBUTING.md | 8 ++++++++ Dockerfile | 7 +++++++ Makefile | 13 +++++++++++++ composer.json | 11 ++++++++++- phpunit.xml | 17 +++++++++++++++++ tests/TestCase.php | 31 +++++++++++++++++++++++++++++++ tests/TestModel.php | 21 +++++++++++++++++++++ 10 files changed, 131 insertions(+), 1 deletion(-) create mode 100644 .editorconfig create mode 100644 .github/workflows/ci.yml create mode 100644 CONTRIBUTING.md create mode 100644 Dockerfile create mode 100644 Makefile create mode 100644 phpunit.xml create mode 100644 tests/TestCase.php create mode 100644 tests/TestModel.php diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..20a38a0 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,8 @@ +root = true + +[*] +charset = utf-8 +end_of_line = lf +indent_size = 4 +indent_style = space +insert_final_newline = true diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..280a6ca --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,15 @@ +name: CI + +on: [push] + +jobs: + build-test: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v2 + - uses: php-actions/composer@v1 + - name: PHPUnit Tests + uses: php-actions/phpunit@v9 + with: + configuration: test/phpunit.xml diff --git a/.gitignore b/.gitignore index ac85e9c..a1e77f3 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ .idea/ composer.lock /vendor +/.phpunit.result.cache diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..76fa960 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,8 @@ +# Contribution Guide + +1. Make sure to include unit tests + +## Unit tests + +You can run unit tests locally by executing `make` once +and then `make test` for consecutive runs (you will need to install docker before). diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..23aa7b3 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,7 @@ +FROM composer AS composer +FROM php:7.2-cli +COPY --from=composer /usr/bin/composer /usr/bin/composer +WORKDIR /app + +RUN apt-get update && \ + apt-get install -y zip unzip git \ No newline at end of file diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..c3615a8 --- /dev/null +++ b/Makefile @@ -0,0 +1,13 @@ +all: build install test + +test: + docker run -it -v $(shell pwd):/app laravel-scout-mysql-driver vendor/bin/phpunit + +install: + docker run -it -v $(shell pwd):/app laravel-scout-mysql-driver composer install + +bash: + docker run -it -v $(shell pwd):/app -it laravel-scout-mysql-driver bash + +build: + docker build -t laravel-scout-mysql-driver:latest . diff --git a/composer.json b/composer.json index 31f7ccb..40a146a 100644 --- a/composer.json +++ b/composer.json @@ -12,11 +12,15 @@ "email": "matt@yabhq.com" } ], - "minimum-stability": "dev", "require": { "php": "^7.2|^8.0", "laravel/scout": "~6.0|~7.0|~8.0" }, + "require-dev": { + "phpunit/phpunit": "8.5.x-dev", + "laravel/framework": "5.6.* || 5.7.* || 5.8.* || ^6.0 || ^7.0", + "mockery/mockery": "^1.3" + }, "autoload": { "psr-4": { "Yab\\MySQLScout\\": "src/" @@ -25,6 +29,11 @@ "src/helpers.php" ] }, + "autoload-dev": { + "psr-4": { + "Tests\\": "tests/" + } + }, "extra": { "laravel": { "providers": [ diff --git a/phpunit.xml b/phpunit.xml new file mode 100644 index 0000000..e8586c3 --- /dev/null +++ b/phpunit.xml @@ -0,0 +1,17 @@ + + + + + ./tests + + + + + ./src + + + diff --git a/tests/TestCase.php b/tests/TestCase.php new file mode 100644 index 0000000..2c991d1 --- /dev/null +++ b/tests/TestCase.php @@ -0,0 +1,31 @@ + [ + 'mysql' => [ + 'mode' => 'NATURAL_LANGUAGE', + 'model_directories' => [__DIR__], + 'min_search_length' => 0, + 'min_fulltext_search_length' => 4, + 'min_fulltext_search_fallback' => 'LIKE', + 'query_expansion' => false + ] + ] + ]); + + app()->instance('config', $config); + } +} diff --git a/tests/TestModel.php b/tests/TestModel.php new file mode 100644 index 0000000..d9ca4ca --- /dev/null +++ b/tests/TestModel.php @@ -0,0 +1,21 @@ + 'Steve', + 'last_name' => 'Broski', + ]; + } +} From 4c6b60a69295701e68f95a7c8f95cc7d91b8a4b8 Mon Sep 17 00:00:00 2001 From: Konstantin Duczek Date: Sun, 23 Aug 2020 12:11:26 +0200 Subject: [PATCH 21/35] ensure query extension --- src/Engines/Modes/Mode.php | 3 + src/Engines/Modes/NaturalLanguage.php | 21 +++---- tests/Engines/Modes/NaturalLanguageTest.php | 64 +++++++++++++++++++++ 3 files changed, 78 insertions(+), 10 deletions(-) create mode 100644 tests/Engines/Modes/NaturalLanguageTest.php diff --git a/src/Engines/Modes/Mode.php b/src/Engines/Modes/Mode.php index 8aa57ef..a1607d5 100644 --- a/src/Engines/Modes/Mode.php +++ b/src/Engines/Modes/Mode.php @@ -9,6 +9,9 @@ abstract class Mode { protected $whereParams = []; + /** + * @var ModelService + */ protected $modelService; public function __construct() diff --git a/src/Engines/Modes/NaturalLanguage.php b/src/Engines/Modes/NaturalLanguage.php index adf8178..21ed6b5 100644 --- a/src/Engines/Modes/NaturalLanguage.php +++ b/src/Engines/Modes/NaturalLanguage.php @@ -8,13 +8,21 @@ class NaturalLanguage extends Mode { public function buildWhereRawString(Builder $builder) { - $queryString = ''; + return $this->buildWheres($builder) . $this->buildMatchQuery($builder); + } + + public function buildSelectColumns(Builder $builder) + { + $matchQuery = $this->buildMatchQuery($builder); - $queryString .= $this->buildWheres($builder); + return "*, $matchQuery as relevance"; + } + private function buildMatchQuery(Builder $builder) + { $indexFields = implode(',', $this->modelService->setModel($builder->model)->getFullTextIndexFields()); - $queryString .= "MATCH($indexFields) AGAINST(? IN NATURAL LANGUAGE MODE"; + $queryString = "MATCH($indexFields) AGAINST(? IN NATURAL LANGUAGE MODE"; if (config('scout.mysql.query_expansion')) { $queryString .= ' WITH QUERY EXPANSION'; @@ -25,13 +33,6 @@ public function buildWhereRawString(Builder $builder) return $queryString; } - public function buildSelectColumns(Builder $builder) - { - $indexFields = implode(',', $this->modelService->setModel($builder->model)->getFullTextIndexFields()); - - return "*, MATCH($indexFields) AGAINST(? IN NATURAL LANGUAGE MODE) AS relevance"; - } - public function buildParams(Builder $builder) { $this->whereParams[] = $builder->query; diff --git a/tests/Engines/Modes/NaturalLanguageTest.php b/tests/Engines/Modes/NaturalLanguageTest.php new file mode 100644 index 0000000..02b3675 --- /dev/null +++ b/tests/Engines/Modes/NaturalLanguageTest.php @@ -0,0 +1,64 @@ +mockDb(); + + $mode = new NaturalLanguage(); + $builder = new Builder(new TestModel(), __METHOD__); + + $this->assertEquals( + '*, MATCH(first_name,last_name) AGAINST(? IN NATURAL LANGUAGE MODE) as relevance', + $mode->buildSelectColumns($builder) + ); + $this->assertEquals( + 'MATCH(first_name,last_name) AGAINST(? IN NATURAL LANGUAGE MODE)', + $mode->buildWhereRawString($builder) + ); + $this->assertEquals([__METHOD__], $mode->buildParams($builder)); + } + + public function testWithQueryExpansion() + { + $this->mockDb(); + config()->set('scout.mysql.query_expansion', true); + + $mode = new NaturalLanguage(); + $builder = new Builder(new TestModel(), __METHOD__); + + $this->assertEquals( + '*, MATCH(first_name,last_name) AGAINST(? IN NATURAL LANGUAGE MODE WITH QUERY EXPANSION) as relevance', + $mode->buildSelectColumns($builder) + ); + $this->assertEquals( + 'MATCH(first_name,last_name) AGAINST(? IN NATURAL LANGUAGE MODE WITH QUERY EXPANSION)', + $mode->buildWhereRawString($builder) + ); + $this->assertEquals([__METHOD__], $mode->buildParams($builder)); + } + + private function mockDb(): void + { + DB::shouldReceive('connection')->andReturnSelf(); + DB::shouldReceive('getSchemaBuilder')->andReturnSelf(); + DB::shouldReceive('getColumnListing')->andReturn([ + 'first_name', + 'last_name', + 'age', + ]); + DB::shouldReceive('select')->andReturn([ + (object)['Type' => 'VARCHAR'], + ]); + } +} From ea4190787f487b9cb110c8f52a26184e4a8c9847 Mon Sep 17 00:00:00 2001 From: Konstantin Duczek Date: Sun, 23 Aug 2020 12:11:52 +0200 Subject: [PATCH 22/35] remove copypasta error --- .github/workflows/ci.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 280a6ca..6a4c879 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -11,5 +11,3 @@ jobs: - uses: php-actions/composer@v1 - name: PHPUnit Tests uses: php-actions/phpunit@v9 - with: - configuration: test/phpunit.xml From 115be8168af1a70814fbc404ade121502c746009 Mon Sep 17 00:00:00 2001 From: Konstantin Duczek Date: Sun, 23 Aug 2020 12:18:05 +0200 Subject: [PATCH 23/35] fix phpunit version, add php versions to tests --- .editorconfig | 3 +++ .github/workflows/ci.yml | 12 +++++++++++- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/.editorconfig b/.editorconfig index 20a38a0..97fbc59 100644 --- a/.editorconfig +++ b/.editorconfig @@ -6,3 +6,6 @@ end_of_line = lf indent_size = 4 indent_style = space insert_final_newline = true + +[*.yml] +indent_size = 2 diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 6a4c879..bc1d796 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -6,8 +6,18 @@ jobs: build-test: runs-on: ubuntu-latest + strategy: + matrix: + php-versions: + - 7.2 + - 7.3 + - 7.4 + steps: - uses: actions/checkout@v2 + - uses: shivammathur/setup-php@v2 + with: + php-version: ${{ matrix.php-versions }} - uses: php-actions/composer@v1 - name: PHPUnit Tests - uses: php-actions/phpunit@v9 + uses: php-actions/phpunit@v8 From ecc641a495eaa8e2dfecfc32a7f02d06b8b6d40f Mon Sep 17 00:00:00 2001 From: Manash Sonowal Date: Fri, 16 Apr 2021 11:14:12 +0530 Subject: [PATCH 24/35] Update composer.json --- composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.json b/composer.json index 40a146a..e7e9b9e 100644 --- a/composer.json +++ b/composer.json @@ -18,7 +18,7 @@ }, "require-dev": { "phpunit/phpunit": "8.5.x-dev", - "laravel/framework": "5.6.* || 5.7.* || 5.8.* || ^6.0 || ^7.0", + "laravel/framework": "5.6.* || 5.7.* || 5.8.* || ^6.0 || ^7.0 || ^8.0", "mockery/mockery": "^1.3" }, "autoload": { From 693629aedee173174a5b028b858bed6db6705618 Mon Sep 17 00:00:00 2001 From: Gitau Karugi Date: Sat, 9 May 2020 20:18:51 +0300 Subject: [PATCH 25/35] add documentation about laravel auto-discovery --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 2806936..69ec46e 100644 --- a/README.md +++ b/README.md @@ -23,7 +23,7 @@ Install this package via **Composer** `composer require yab/laravel-scout-mysql-driver` -Next add the ServiceProvider to the Package Service Providers in `config/app.php` +Next if you are using laravel version > 5.5 you can safely skip this step as laravel auto-discovery does that for you. If using laravel < 5.5, add the ServiceProvider to the Package Service Providers in `config/app.php` ```php /* From c3d002f752ab0a6da1a9cfdec0b0ff2a222dce6a Mon Sep 17 00:00:00 2001 From: Gitau Karugi Date: Sat, 9 May 2020 20:25:18 +0300 Subject: [PATCH 26/35] update autodiscovery documentation --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 69ec46e..72e4d8c 100644 --- a/README.md +++ b/README.md @@ -23,7 +23,7 @@ Install this package via **Composer** `composer require yab/laravel-scout-mysql-driver` -Next if you are using laravel version > 5.5 you can safely skip this step as laravel auto-discovery does that for you. If using laravel < 5.5, add the ServiceProvider to the Package Service Providers in `config/app.php` +Next if you are using laravel version 5.4, include the following ServiceProvider to the Providers array in `config/app.php` ```php /* From 04fc37970fc3c22ea817261701e8c125c55208cb Mon Sep 17 00:00:00 2001 From: Anthony Vanden Bossche Date: Mon, 22 Jun 2020 14:47:17 +0200 Subject: [PATCH 27/35] prefixed fields with table name in like and like expanded modes --- src/Engines/Modes/Like.php | 4 +++- src/Engines/Modes/LikeExpanded.php | 6 ++++-- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/src/Engines/Modes/Like.php b/src/Engines/Modes/Like.php index 6ee7181..4999882 100644 --- a/src/Engines/Modes/Like.php +++ b/src/Engines/Modes/Like.php @@ -11,6 +11,8 @@ class Like extends Mode public function buildWhereRawString(Builder $builder) { + $table = $builder->model->getTable(); + $queryString = ''; $this->fields = $this->modelService->setModel($builder->model)->getSearchableFields(); @@ -20,7 +22,7 @@ public function buildWhereRawString(Builder $builder) $queryString .= '('; foreach ($this->fields as $field) { - $queryString .= "`$field` LIKE ? OR "; + $queryString .= "`$table`.`$field` LIKE ? OR "; } $queryString = trim($queryString, 'OR '); diff --git a/src/Engines/Modes/LikeExpanded.php b/src/Engines/Modes/LikeExpanded.php index e4d711a..bfcd388 100644 --- a/src/Engines/Modes/LikeExpanded.php +++ b/src/Engines/Modes/LikeExpanded.php @@ -11,6 +11,8 @@ class LikeExpanded extends Mode public function buildWhereRawString(Builder $builder) { + $table = $builder->model->getTable(); + $queryString = ''; $this->fields = $this->modelService->setModel($builder->model)->getSearchableFields(); @@ -23,14 +25,14 @@ public function buildWhereRawString(Builder $builder) foreach ($this->fields as $field) { foreach ($words as $word) { - $queryString .= "`$field` LIKE ? OR "; + $queryString .= "`$table`.`$field` LIKE ? OR "; } } $queryString = trim($queryString, 'OR '); $queryString .= ')'; - return$queryString; + return $queryString; } public function buildParams(Builder $builder) From 748805920824915489d5f2791eb72baac9352bb1 Mon Sep 17 00:00:00 2001 From: Roman Miranda Date: Mon, 6 Jul 2020 14:15:03 -0500 Subject: [PATCH 28/35] Add escaped quotes to sql sentences --- src/Services/IndexService.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Services/IndexService.php b/src/Services/IndexService.php index 9c641ce..915b0f1 100644 --- a/src/Services/IndexService.php +++ b/src/Services/IndexService.php @@ -78,7 +78,7 @@ protected function createIndex() } DB::connection($this->modelService->connectionName) - ->statement("CREATE FULLTEXT INDEX $indexName ON $tableName ($indexFields)"); + ->statement("CREATE FULLTEXT INDEX `$indexName` ON `$tableName` ($indexFields)"); event(new Events\ModelIndexCreated($indexName, $indexFields)); } @@ -89,7 +89,7 @@ protected function indexAlreadyExists() $indexName = $this->modelService->indexName; return !empty(DB::connection($this->modelService->connectionName)-> - select("SHOW INDEX FROM $tableName WHERE Key_name = ?", [$indexName])); + select("SHOW INDEX FROM `$tableName` WHERE Key_name = ?", [$indexName])); } protected function indexNeedsUpdate() @@ -106,7 +106,7 @@ protected function getIndexFields() $tableName = $this->modelService->tablePrefixedName; $index = DB::connection($this->modelService->connectionName)-> - select("SHOW INDEX FROM $tableName WHERE Key_name = ?", [$indexName]); + select("SHOW INDEX FROM `$tableName` WHERE Key_name = ?", [$indexName]); $indexFields = []; @@ -136,7 +136,7 @@ public function dropIndex() if ($this->indexAlreadyExists()) { DB::connection($this->modelService->connectionName) - ->statement("ALTER TABLE $tableName DROP INDEX $indexName"); + ->statement("ALTER TABLE `$tableName` DROP INDEX `$indexName`"); event(new Events\ModelIndexDropped($this->modelService->indexName)); } } From 513dd2a51b7a3b30db111b36d7205b9c65195cc4 Mon Sep 17 00:00:00 2001 From: Roman Miranda Date: Mon, 6 Jul 2020 14:15:41 -0500 Subject: [PATCH 29/35] Update ModelService.php --- src/Services/ModelService.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Services/ModelService.php b/src/Services/ModelService.php index 3b0e0b5..e1fcd48 100644 --- a/src/Services/ModelService.php +++ b/src/Services/ModelService.php @@ -48,7 +48,7 @@ public function getFullTextIndexFields() foreach ($searchableFields as $searchableField) { //@TODO cache this. - $sql = "SHOW FIELDS FROM $this->tablePrefixedName where Field = ?"; + $sql = "SHOW FIELDS FROM `$this->tablePrefixedName` where Field = ?"; $column = DB::connection($this->connectionName)->select($sql, [$searchableField]); if (!isset($column[0])) { From 7b27a8116124303998a99b8e14e35ac2c9f2a91a Mon Sep 17 00:00:00 2001 From: Roman Miranda Date: Mon, 6 Jul 2020 19:01:29 -0500 Subject: [PATCH 30/35] Update IndexService.php --- src/Services/IndexService.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Services/IndexService.php b/src/Services/IndexService.php index 915b0f1..533d44a 100644 --- a/src/Services/IndexService.php +++ b/src/Services/IndexService.php @@ -89,7 +89,7 @@ protected function indexAlreadyExists() $indexName = $this->modelService->indexName; return !empty(DB::connection($this->modelService->connectionName)-> - select("SHOW INDEX FROM `$tableName` WHERE Key_name = ?", [$indexName])); + select("SHOW INDEX FROM `$tableName` WHERE `Key_name` = ?", [$indexName])); } protected function indexNeedsUpdate() @@ -106,7 +106,7 @@ protected function getIndexFields() $tableName = $this->modelService->tablePrefixedName; $index = DB::connection($this->modelService->connectionName)-> - select("SHOW INDEX FROM `$tableName` WHERE Key_name = ?", [$indexName]); + select("SHOW INDEX FROM `$tableName` WHERE `Key_name` = ?", [$indexName]); $indexFields = []; From c377525dadb15ed9cf88a12cc370a1523b3d2a57 Mon Sep 17 00:00:00 2001 From: Roman Miranda Date: Mon, 6 Jul 2020 19:02:09 -0500 Subject: [PATCH 31/35] Update ModelService.php --- src/Services/ModelService.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Services/ModelService.php b/src/Services/ModelService.php index e1fcd48..7ac9877 100644 --- a/src/Services/ModelService.php +++ b/src/Services/ModelService.php @@ -48,7 +48,7 @@ public function getFullTextIndexFields() foreach ($searchableFields as $searchableField) { //@TODO cache this. - $sql = "SHOW FIELDS FROM `$this->tablePrefixedName` where Field = ?"; + $sql = "SHOW FIELDS FROM `$this->tablePrefixedName` where `Field` = ?"; $column = DB::connection($this->connectionName)->select($sql, [$searchableField]); if (!isset($column[0])) { From 501babf30d1a8b802b7ac3e0f3ffc220fd20120d Mon Sep 17 00:00:00 2001 From: Casper Lai Date: Tue, 10 Aug 2021 15:57:44 +0800 Subject: [PATCH 32/35] Support scout v9 --- composer.json | 2 +- src/Engines/MySQLEngine.php | 41 +++++++++++++++++++++++++++++++++++++ 2 files changed, 42 insertions(+), 1 deletion(-) diff --git a/composer.json b/composer.json index e7e9b9e..8b53ecd 100644 --- a/composer.json +++ b/composer.json @@ -14,7 +14,7 @@ ], "require": { "php": "^7.2|^8.0", - "laravel/scout": "~6.0|~7.0|~8.0" + "laravel/scout": "~6.0|~7.0|~8.0|~9.0" }, "require-dev": { "phpunit/phpunit": "8.5.x-dev", diff --git a/src/Engines/MySQLEngine.php b/src/Engines/MySQLEngine.php index 95422e8..5480319 100644 --- a/src/Engines/MySQLEngine.php +++ b/src/Engines/MySQLEngine.php @@ -2,6 +2,7 @@ namespace Yab\MySQLScout\Engines; +use Illuminate\Support\LazyCollection; use Yab\MySQLScout\Engines\Modes\ModeContainer; use Illuminate\Database\Eloquent\Collection; use Illuminate\Support\Facades\DB; @@ -165,4 +166,44 @@ protected function shouldUseFallback($builder) strlen($builder->query) < config('scout.mysql.min_fulltext_search_length')) || $this->fallbackSearchShouldBeUsedForModel($builder); } + + /** + * Map the given results to instances of the given model via a lazy collection. + * + * @param \Laravel\Scout\Builder $builder + * @param mixed $results + * @param \Illuminate\Database\Eloquent\Model $model + * @return \Illuminate\Support\LazyCollection + */ + public function lazyMap(Builder $builder, $results, $model) + { + if ($this->getTotalCount($results) === 0) { + return LazyCollection::empty(); + } + + return LazyCollection::make($results['results']->all()); + } + + /** + * Create a search index. + * + * @param string $name + * @param array $options + * @return mixed + */ + public function createIndex($name, array $options = []) + { + + } + + /** + * Delete a search index. + * + * @param string $name + * @return mixed + */ + public function deleteIndex($name) + { + + } } From fd9d3af5118a86fac6f07cda5cad410192a5f313 Mon Sep 17 00:00:00 2001 From: jbardnz Date: Tue, 7 Dec 2021 16:05:13 +1300 Subject: [PATCH 33/35] Added not null logic --- src/Engines/Modes/Mode.php | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/Engines/Modes/Mode.php b/src/Engines/Modes/Mode.php index a1607d5..a4cb7b6 100644 --- a/src/Engines/Modes/Mode.php +++ b/src/Engines/Modes/Mode.php @@ -42,7 +42,12 @@ protected function buildWheres(Builder $builder) $this->whereParams[$field] = $value; $queryString .= "$field $operator ? AND "; } else { - $queryString .= "$field IS NULL AND "; + + if($operator === '!='){ + $queryString .= "$field IS NOT NULL AND "; + }else{ + $queryString .= "$field IS NULL AND "; + } } } From 83e0662726fc7649f11aa68a3c887d947e6bc40c Mon Sep 17 00:00:00 2001 From: Gonzalo Martinez Date: Tue, 5 Jan 2021 22:04:40 -0300 Subject: [PATCH 34/35] Support json columns using '->' syntax in where() --- src/Engines/Modes/Mode.php | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/Engines/Modes/Mode.php b/src/Engines/Modes/Mode.php index a4cb7b6..fb83262 100644 --- a/src/Engines/Modes/Mode.php +++ b/src/Engines/Modes/Mode.php @@ -64,6 +64,17 @@ private function parseWheres($wheres) $result [] = !empty($matches) ? array($matches[1], $matches[2], $value) : array($field, '=', $value); } + /** + * Add support for where() on json columns using '->' syntax + * data->a->b->c translates to json_unquote(json_extract(`data`, '$."a"."b"."c"')) + */ + foreach ($result as $_k => $_v) { + if (($_v[0] ?? false) && stripos($_v[0],'->')!==false) { + list($root,$path) = explode('->',$_v[0],2); + $result[$_k][0] = "json_unquote(json_extract(`$root`, '$.\"".implode('"."',explode('->',$path))."\"'))"; + } + } + return $result; } } From e8dadf95ccf87efd79c4e1d0a8356e37e602e9bc Mon Sep 17 00:00:00 2001 From: Gonzalo Martinez Date: Tue, 5 Jan 2021 22:18:36 -0300 Subject: [PATCH 35/35] Fix for fulltext w/where() not working MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit When using fulltext search + where() clause(s) in place even when I knew the combination should bring entries none was retrieved. I found that the $params array get populated in the wrong order. Eg; select *, MATCH(name,email,data) AGAINST(? IN NATURAL LANGUAGE MODE) AS relevance from `users` where guid = ? AND MATCH(name,email,data) AGAINST(? IN BOOLEAN MODE) array:2 [▼ "guid" => "9260a604-22b6-4075-891e-a82d52ba69fe" 0 => "text2search4" ] after ksort($params,SORT_NATURAL); the $params lists gets; array:2 [▼ 0 => "text2search4" "guid" => "9260a604-22b6-4075-891e-a82d52ba69fe" ] --- src/Engines/MySQLEngine.php | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Engines/MySQLEngine.php b/src/Engines/MySQLEngine.php index 5480319..1f6d626 100644 --- a/src/Engines/MySQLEngine.php +++ b/src/Engines/MySQLEngine.php @@ -65,6 +65,7 @@ public function search(Builder $builder) $whereRawString = $mode->buildWhereRawString($builder); $params = $mode->buildParams($builder); + ksort($params,SORT_NATURAL); $model = $builder->model; $query = $model::whereRaw($whereRawString, $params);