From cc9dd945127ecb35d97fee8dae940d8f212b24ab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Tamarelle?= Date: Tue, 12 Mar 2024 14:28:55 +0100 Subject: [PATCH 1/2] PHPORM-159 Add tests on whereAny and whereAll --- src/Query/Builder.php | 5 -- tests/Models/User.php | 2 +- tests/Query/BuilderTest.php | 132 ++++++++++++++++++++++++++++++++++++ 3 files changed, 133 insertions(+), 6 deletions(-) diff --git a/src/Query/Builder.php b/src/Query/Builder.php index 4efa76252..0f05f4577 100644 --- a/src/Query/Builder.php +++ b/src/Query/Builder.php @@ -1154,11 +1154,6 @@ protected function compileWheres(): array return $compiled; } - /** - * @param array $where - * - * @return array - */ protected function compileWhereBasic(array $where): array { $column = $where['column']; diff --git a/tests/Models/User.php b/tests/Models/User.php index f2d2cf7cc..98f76d931 100644 --- a/tests/Models/User.php +++ b/tests/Models/User.php @@ -130,7 +130,7 @@ protected function username(): Attribute { return Attribute::make( get: fn ($value) => $value, - set: fn ($value) => Str::slug($value) + set: fn ($value) => Str::slug($value), ); } diff --git a/tests/Query/BuilderTest.php b/tests/Query/BuilderTest.php index 6df0b1a42..0554f64b2 100644 --- a/tests/Query/BuilderTest.php +++ b/tests/Query/BuilderTest.php @@ -1157,6 +1157,138 @@ function (Builder $elemMatchQuery): void { }, ), ]; + + /** @see DatabaseQueryBuilderTest::testWhereAll */ + yield 'whereAll' => [ + [ + 'find' => [ + ['$and' => [['last_name' => 'Doe'], ['email' => 'Doe']]], + [], // options + ], + ], + fn (Builder $builder) => $builder->whereAll(['last_name', 'email'], 'Doe'), + ]; + + yield 'whereAll operator' => [ + [ + 'find' => [ + [ + '$and' => [ + ['last_name' => ['$not' => new Regex('^.*Doe.*$', 'i')]], + ['email' => ['$not' => new Regex('^.*Doe.*$', 'i')]], + ], + ], + [], // options + ], + ], + fn (Builder $builder) => $builder->whereAll(['last_name', 'email'], 'not like', '%Doe%'), + ]; + + /** @see DatabaseQueryBuilderTest::testOrWhereAll */ + yield 'orWhereAll' => [ + [ + 'find' => [ + [ + '$or' => [ + ['first_name' => 'John'], + ['$and' => [['last_name' => 'Doe'], ['email' => 'Doe']]], + ], + ], + [], // options + ], + ], + fn (Builder $builder) => $builder + ->where('first_name', 'John') + ->orWhereAll(['last_name', 'email'], 'Doe'), + ]; + + yield 'orWhereAll operator' => [ + [ + 'find' => [ + [ + '$or' => [ + ['first_name' => new Regex('^.*John.*$', 'i')], + [ + '$and' => [ + ['last_name' => ['$not' => new Regex('^.*Doe.*$', 'i')]], + ['email' => ['$not' => new Regex('^.*Doe.*$', 'i')]], + ], + ], + ], + ], + [], // options + ], + ], + fn (Builder $builder) => $builder + ->where('first_name', 'like', '%John%') + ->orWhereAll(['last_name', 'email'], 'not like', '%Doe%'), + ]; + + /** @see DatabaseQueryBuilderTest::testWhereAny */ + yield 'whereAny' => [ + [ + 'find' => [ + ['$or' => [['last_name' => 'Doe'], ['email' => 'Doe']]], + [], // options + ], + ], + fn (Builder $builder) => $builder->whereAny(['last_name', 'email'], 'Doe'), + ]; + + yield 'whereAny operator' => [ + [ + 'find' => [ + [ + '$or' => [ + ['last_name' => ['$not' => new Regex('^.*Doe.*$', 'i')]], + ['email' => ['$not' => new Regex('^.*Doe.*$', 'i')]], + ], + ], + [], // options + ], + ], + fn (Builder $builder) => $builder->whereAny(['last_name', 'email'], 'not like', '%Doe%'), + ]; + + /** @see DatabaseQueryBuilderTest::testOrWhereAny */ + yield 'orWhereAny' => [ + [ + 'find' => [ + [ + '$or' => [ + ['first_name' => 'John'], + ['$or' => [['last_name' => 'Doe'], ['email' => 'Doe']]], + ], + ], + [], // options + ], + ], + fn (Builder $builder) => $builder + ->where('first_name', 'John') + ->orWhereAny(['last_name', 'email'], 'Doe'), + ]; + + yield 'orWhereAny operator' => [ + [ + 'find' => [ + [ + '$or' => [ + ['first_name' => new Regex('^.*John.*$', 'i')], + [ + '$or' => [ + ['last_name' => ['$not' => new Regex('^.*Doe.*$', 'i')]], + ['email' => ['$not' => new Regex('^.*Doe.*$', 'i')]], + ], + ], + ], + ], + [], // options + ], + ], + fn (Builder $builder) => $builder + ->where('first_name', 'like', '%John%') + ->orWhereAny(['last_name', 'email'], 'not like', '%Doe%'), + ]; } /** @dataProvider provideExceptions */ From 18b0eab8f67ea4b032c4da7d571c9a6a507cc29f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Tamarelle?= Date: Tue, 12 Mar 2024 15:27:32 +0100 Subject: [PATCH 2/2] New tests require Laravel v10.47 --- tests/Query/BuilderTest.php | 219 +++++++++++++++++++----------------- 1 file changed, 113 insertions(+), 106 deletions(-) diff --git a/tests/Query/BuilderTest.php b/tests/Query/BuilderTest.php index 0554f64b2..4076b3028 100644 --- a/tests/Query/BuilderTest.php +++ b/tests/Query/BuilderTest.php @@ -23,6 +23,7 @@ use stdClass; use function collect; +use function method_exists; use function now; use function var_export; @@ -1158,137 +1159,143 @@ function (Builder $elemMatchQuery): void { ), ]; - /** @see DatabaseQueryBuilderTest::testWhereAll */ - yield 'whereAll' => [ - [ - 'find' => [ - ['$and' => [['last_name' => 'Doe'], ['email' => 'Doe']]], - [], // options + // Method added in Laravel v10.47.0 + if (method_exists(Builder::class, 'whereAll')) { + /** @see DatabaseQueryBuilderTest::testWhereAll */ + yield 'whereAll' => [ + [ + 'find' => [ + ['$and' => [['last_name' => 'Doe'], ['email' => 'Doe']]], + [], // options + ], ], - ], - fn (Builder $builder) => $builder->whereAll(['last_name', 'email'], 'Doe'), - ]; - - yield 'whereAll operator' => [ - [ - 'find' => [ - [ - '$and' => [ - ['last_name' => ['$not' => new Regex('^.*Doe.*$', 'i')]], - ['email' => ['$not' => new Regex('^.*Doe.*$', 'i')]], + fn(Builder $builder) => $builder->whereAll(['last_name', 'email'], 'Doe'), + ]; + + yield 'whereAll operator' => [ + [ + 'find' => [ + [ + '$and' => [ + ['last_name' => ['$not' => new Regex('^.*Doe.*$', 'i')]], + ['email' => ['$not' => new Regex('^.*Doe.*$', 'i')]], + ], ], + [], // options ], - [], // options ], - ], - fn (Builder $builder) => $builder->whereAll(['last_name', 'email'], 'not like', '%Doe%'), - ]; - - /** @see DatabaseQueryBuilderTest::testOrWhereAll */ - yield 'orWhereAll' => [ - [ - 'find' => [ - [ - '$or' => [ - ['first_name' => 'John'], - ['$and' => [['last_name' => 'Doe'], ['email' => 'Doe']]], + fn(Builder $builder) => $builder->whereAll(['last_name', 'email'], 'not like', '%Doe%'), + ]; + + /** @see DatabaseQueryBuilderTest::testOrWhereAll */ + yield 'orWhereAll' => [ + [ + 'find' => [ + [ + '$or' => [ + ['first_name' => 'John'], + ['$and' => [['last_name' => 'Doe'], ['email' => 'Doe']]], + ], ], + [], // options ], - [], // options ], - ], - fn (Builder $builder) => $builder - ->where('first_name', 'John') - ->orWhereAll(['last_name', 'email'], 'Doe'), - ]; - - yield 'orWhereAll operator' => [ - [ - 'find' => [ - [ - '$or' => [ - ['first_name' => new Regex('^.*John.*$', 'i')], - [ - '$and' => [ - ['last_name' => ['$not' => new Regex('^.*Doe.*$', 'i')]], - ['email' => ['$not' => new Regex('^.*Doe.*$', 'i')]], + fn(Builder $builder) => $builder + ->where('first_name', 'John') + ->orWhereAll(['last_name', 'email'], 'Doe'), + ]; + + yield 'orWhereAll operator' => [ + [ + 'find' => [ + [ + '$or' => [ + ['first_name' => new Regex('^.*John.*$', 'i')], + [ + '$and' => [ + ['last_name' => ['$not' => new Regex('^.*Doe.*$', 'i')]], + ['email' => ['$not' => new Regex('^.*Doe.*$', 'i')]], + ], ], ], ], + [], // options ], - [], // options ], - ], - fn (Builder $builder) => $builder - ->where('first_name', 'like', '%John%') - ->orWhereAll(['last_name', 'email'], 'not like', '%Doe%'), - ]; + fn(Builder $builder) => $builder + ->where('first_name', 'like', '%John%') + ->orWhereAll(['last_name', 'email'], 'not like', '%Doe%'), + ]; + } - /** @see DatabaseQueryBuilderTest::testWhereAny */ - yield 'whereAny' => [ - [ - 'find' => [ - ['$or' => [['last_name' => 'Doe'], ['email' => 'Doe']]], - [], // options + // Method added in Laravel v10.47.0 + if (method_exists(Builder::class, 'whereAny')) { + /** @see DatabaseQueryBuilderTest::testWhereAny */ + yield 'whereAny' => [ + [ + 'find' => [ + ['$or' => [['last_name' => 'Doe'], ['email' => 'Doe']]], + [], // options + ], ], - ], - fn (Builder $builder) => $builder->whereAny(['last_name', 'email'], 'Doe'), - ]; - - yield 'whereAny operator' => [ - [ - 'find' => [ - [ - '$or' => [ - ['last_name' => ['$not' => new Regex('^.*Doe.*$', 'i')]], - ['email' => ['$not' => new Regex('^.*Doe.*$', 'i')]], + fn(Builder $builder) => $builder->whereAny(['last_name', 'email'], 'Doe'), + ]; + + yield 'whereAny operator' => [ + [ + 'find' => [ + [ + '$or' => [ + ['last_name' => ['$not' => new Regex('^.*Doe.*$', 'i')]], + ['email' => ['$not' => new Regex('^.*Doe.*$', 'i')]], + ], ], + [], // options ], - [], // options ], - ], - fn (Builder $builder) => $builder->whereAny(['last_name', 'email'], 'not like', '%Doe%'), - ]; - - /** @see DatabaseQueryBuilderTest::testOrWhereAny */ - yield 'orWhereAny' => [ - [ - 'find' => [ - [ - '$or' => [ - ['first_name' => 'John'], - ['$or' => [['last_name' => 'Doe'], ['email' => 'Doe']]], + fn(Builder $builder) => $builder->whereAny(['last_name', 'email'], 'not like', '%Doe%'), + ]; + + /** @see DatabaseQueryBuilderTest::testOrWhereAny */ + yield 'orWhereAny' => [ + [ + 'find' => [ + [ + '$or' => [ + ['first_name' => 'John'], + ['$or' => [['last_name' => 'Doe'], ['email' => 'Doe']]], + ], ], + [], // options ], - [], // options ], - ], - fn (Builder $builder) => $builder - ->where('first_name', 'John') - ->orWhereAny(['last_name', 'email'], 'Doe'), - ]; - - yield 'orWhereAny operator' => [ - [ - 'find' => [ - [ - '$or' => [ - ['first_name' => new Regex('^.*John.*$', 'i')], - [ - '$or' => [ - ['last_name' => ['$not' => new Regex('^.*Doe.*$', 'i')]], - ['email' => ['$not' => new Regex('^.*Doe.*$', 'i')]], + fn(Builder $builder) => $builder + ->where('first_name', 'John') + ->orWhereAny(['last_name', 'email'], 'Doe'), + ]; + + yield 'orWhereAny operator' => [ + [ + 'find' => [ + [ + '$or' => [ + ['first_name' => new Regex('^.*John.*$', 'i')], + [ + '$or' => [ + ['last_name' => ['$not' => new Regex('^.*Doe.*$', 'i')]], + ['email' => ['$not' => new Regex('^.*Doe.*$', 'i')]], + ], ], ], ], + [], // options ], - [], // options ], - ], - fn (Builder $builder) => $builder - ->where('first_name', 'like', '%John%') - ->orWhereAny(['last_name', 'email'], 'not like', '%Doe%'), - ]; + fn(Builder $builder) => $builder + ->where('first_name', 'like', '%John%') + ->orWhereAny(['last_name', 'email'], 'not like', '%Doe%'), + ]; + } } /** @dataProvider provideExceptions */