diff --git a/docs/compatibility-list.md b/docs/compatibility-list.md index 4a12ccd..3a23156 100644 --- a/docs/compatibility-list.md +++ b/docs/compatibility-list.md @@ -74,7 +74,7 @@ rightJoin / rightJoinSub / joinWhere? where / orWhere / whereNot / orWhereNot / whereColumn / whereExists whereBetween / whereNotBetween / whereBetweenColumns / whereNotBetweenColumns / whereJsonContains / whereJsonLength / -whereIn / whereNotIn / whereNull / whereNotNull / +whereIn / whereNotIn / whereNot / orWhereNot / whereNull / whereNotNull / whereDate / whereMonth / whereDay / whereYear / whereTime / whereRaw (use AQL) / whereAll / orWhereAll / whereAny / orWhereAny diff --git a/phpunit.xml b/phpunit.xml index 72599c4..5bc8a49 100644 --- a/phpunit.xml +++ b/phpunit.xml @@ -30,6 +30,7 @@ + diff --git a/tests/Query/WheresTest.php b/tests/Query/WheresTest.php index bd5da57..317311f 100644 --- a/tests/Query/WheresTest.php +++ b/tests/Query/WheresTest.php @@ -530,3 +530,91 @@ expect($results->count())->toBe(2); expect(($results->first())->name)->toBe('Stark'); }); + +test('basic whereNot', function () { + $builder = getBuilder(); + $builder->select('*')->from('characters')->where('surname', 'Lannister')->whereNot('alive', true); + + $this->assertSame( + 'FOR characterDoc IN characters FILTER `characterDoc`.`surname` == @' + . $builder->getQueryId() + . '_where_1 and not `characterDoc`.`alive` == @' + . $builder->getQueryId() + . '_where_2 RETURN characterDoc', + $builder->toSql(), + ); +}); + +test('whereNot nested', function () { + $query = getBuilder(); + $query = $query + ->select('*') + ->from('characters') + ->where('alive', true) + ->whereNot(function ($query) { + $query->where('surname', 'lannister') + ->orWhere('age', '<', 20); + }); + + + $binds = $query->getBindings(); + $bindKeys = array_keys($binds); + + $this->assertSame( + 'FOR characterDoc IN characters FILTER `characterDoc`.`alive` == @' . $bindKeys[0] + . ' and not ( `characterDoc`.`surname` == @' . $bindKeys[1] + . ' or `characterDoc`.`age` < @' . $bindKeys[2] + . ') RETURN characterDoc', + $query->toSql(), + ); +}); + +test('whereNot query results', function () { + $results = \DB::table('characters') + ->where('alive', true) + ->whereNot(function ($query) { + $query->where('surname', 'Lannister') + ->orWhere('age', '<', 20); + })->get(); + + expect($results->count())->toBe(3); +}); + +test('basic orWhereNot', function () { + $builder = getBuilder(); + $builder->select('*')->from('characters')->where('alive', true)->orWhereNot('surname', 'Lannister'); + + $this->assertSame( + 'FOR characterDoc IN characters FILTER `characterDoc`.`alive` == @' + . $builder->getQueryId() + . '_where_1 or not `characterDoc`.`surname` == @' + . $builder->getQueryId() + . '_where_2 RETURN characterDoc', + $builder->toSql(), + ); +}); + + +test('orWhereNot query results', function () { + $results = \DB::table('characters') + ->where('alive', true) + ->orWhereNot('surname', 'Lannister') + ->get(); + + ray($results); + + expect($results->count())->toBe(27); +}); + +test('nest whereNot & orWhereNot', function () { + $builder = \DB::table('characters') + ->where('alive', true) + ->where(function ($query) { + $query->whereNot('surname', 'Lannister') + ->orWhereNot('age', '<', 20); + }); + + $results = $builder->get(); + + expect($results->count())->toBe(27); +});