diff --git a/src/Illuminate/Database/Query/Builder.php b/src/Illuminate/Database/Query/Builder.php index 7dde9d31b1b4..4152b1bb57e9 100755 --- a/src/Illuminate/Database/Query/Builder.php +++ b/src/Illuminate/Database/Query/Builder.php @@ -2238,7 +2238,7 @@ public function orWhereFullText($columns, $value, array $options = []) /** * Add a "where" clause to the query for multiple columns with "and" conditions between them. * - * @param \Illuminate\Contracts\Database\Query\Expression[]|string[] $columns + * @param \Illuminate\Contracts\Database\Query\Expression[]|\Closure[]|string[] $columns * @param mixed $operator * @param mixed $value * @param string $boolean @@ -2262,7 +2262,7 @@ public function whereAll($columns, $operator = null, $value = null, $boolean = ' /** * Add an "or where" clause to the query for multiple columns with "and" conditions between them. * - * @param \Illuminate\Contracts\Database\Query\Expression[]|string[] $columns + * @param \Illuminate\Contracts\Database\Query\Expression[]|\Closure[]|string[] $columns * @param mixed $operator * @param mixed $value * @return $this @@ -2275,7 +2275,7 @@ public function orWhereAll($columns, $operator = null, $value = null) /** * Add a "where" clause to the query for multiple columns with "or" conditions between them. * - * @param \Illuminate\Contracts\Database\Query\Expression[]|string[] $columns + * @param \Illuminate\Contracts\Database\Query\Expression[]|\Closure[]|string[] $columns * @param mixed $operator * @param mixed $value * @param string $boolean @@ -2299,7 +2299,7 @@ public function whereAny($columns, $operator = null, $value = null, $boolean = ' /** * Add an "or where" clause to the query for multiple columns with "or" conditions between them. * - * @param \Illuminate\Contracts\Database\Query\Expression[]|string[] $columns + * @param \Illuminate\Contracts\Database\Query\Expression[]|\Closure[]|string[] $columns * @param mixed $operator * @param mixed $value * @return $this @@ -2312,7 +2312,7 @@ public function orWhereAny($columns, $operator = null, $value = null) /** * Add a "where not" clause to the query for multiple columns where none of the conditions should be true. * - * @param \Illuminate\Contracts\Database\Query\Expression[]|string[] $columns + * @param \Illuminate\Contracts\Database\Query\Expression[]|\Closure[]|string[] $columns * @param mixed $operator * @param mixed $value * @param string $boolean @@ -2326,7 +2326,7 @@ public function whereNone($columns, $operator = null, $value = null, $boolean = /** * Add an "or where not" clause to the query for multiple columns where none of the conditions should be true. * - * @param \Illuminate\Contracts\Database\Query\Expression[]|string[] $columns + * @param \Illuminate\Contracts\Database\Query\Expression[]|\Closure[]|string[] $columns * @param mixed $operator * @param mixed $value * @return $this diff --git a/tests/Database/DatabaseQueryBuilderTest.php b/tests/Database/DatabaseQueryBuilderTest.php index aa32a552566f..037a7e06f2df 100755 --- a/tests/Database/DatabaseQueryBuilderTest.php +++ b/tests/Database/DatabaseQueryBuilderTest.php @@ -1325,6 +1325,14 @@ public function testWhereAll() $builder->select('*')->from('users')->whereAll(['last_name', 'email'], 'not like', '%Otwell%'); $this->assertSame('select * from "users" where ("last_name" not like ? and "email" not like ?)', $builder->toSql()); $this->assertEquals(['%Otwell%', '%Otwell%'], $builder->getBindings()); + + $builder = $this->getBuilder(); + $builder->select('*')->from('users')->whereAll([ + fn(Builder $query) => $query->where('last_name', 'like', '%Otwell%'), + fn(Builder $query) => $query->where('email', 'like', '%Otwell%'), + ]); + $this->assertSame('select * from "users" where (("last_name" like ?) and ("email" like ?))', $builder->toSql()); + $this->assertEquals(['%Otwell%', '%Otwell%'], $builder->getBindings()); } public function testOrWhereAll() @@ -1343,6 +1351,14 @@ public function testOrWhereAll() $builder->select('*')->from('users')->where('first_name', 'like', '%Taylor%')->orWhereAll(['last_name', 'email'], '%Otwell%'); $this->assertSame('select * from "users" where "first_name" like ? or ("last_name" = ? and "email" = ?)', $builder->toSql()); $this->assertEquals(['%Taylor%', '%Otwell%', '%Otwell%'], $builder->getBindings()); + + $builder = $this->getBuilder(); + $builder->select('*')->from('users')->where('first_name', 'like', '%Taylor%')->orWhereAll([ + fn(Builder $query) => $query->where('last_name', 'like', '%Otwell%'), + fn(Builder $query) => $query->where('email', 'like', '%Otwell%'), + ]); + $this->assertSame('select * from "users" where "first_name" like ? or (("last_name" like ?) and ("email" like ?))', $builder->toSql()); + $this->assertEquals(['%Taylor%', '%Otwell%', '%Otwell%'], $builder->getBindings()); } public function testWhereAny() @@ -1356,6 +1372,14 @@ public function testWhereAny() $builder->select('*')->from('users')->whereAny(['last_name', 'email'], '%Otwell%'); $this->assertSame('select * from "users" where ("last_name" = ? or "email" = ?)', $builder->toSql()); $this->assertEquals(['%Otwell%', '%Otwell%'], $builder->getBindings()); + + $builder = $this->getBuilder(); + $builder->select('*')->from('users')->whereAny([ + fn(Builder $query) => $query->where('last_name', 'like', '%Otwell%'), + fn(Builder $query) => $query->where('email', 'like', '%Otwell%'), + ]); + $this->assertSame('select * from "users" where (("last_name" like ?) or ("email" like ?))', $builder->toSql()); + $this->assertEquals(['%Otwell%', '%Otwell%'], $builder->getBindings()); } public function testOrWhereAny() @@ -1374,6 +1398,14 @@ public function testOrWhereAny() $builder->select('*')->from('users')->where('first_name', 'like', '%Taylor%')->orWhereAny(['last_name', 'email'], '%Otwell%'); $this->assertSame('select * from "users" where "first_name" like ? or ("last_name" = ? or "email" = ?)', $builder->toSql()); $this->assertEquals(['%Taylor%', '%Otwell%', '%Otwell%'], $builder->getBindings()); + + $builder = $this->getBuilder(); + $builder->select('*')->from('users')->where('first_name', 'like', '%Taylor%')->orWhereAny([ + fn(Builder $query) => $query->where('last_name', 'like', '%Otwell%'), + fn(Builder $query) => $query->where('email', 'like', '%Otwell%'), + ]); + $this->assertSame('select * from "users" where "first_name" like ? or (("last_name" like ?) or ("email" like ?))', $builder->toSql()); + $this->assertEquals(['%Taylor%', '%Otwell%', '%Otwell%'], $builder->getBindings()); } public function testWhereNone() @@ -1392,6 +1424,14 @@ public function testWhereNone() $builder->select('*')->from('users')->where('first_name', 'like', '%Taylor%')->whereNone(['last_name', 'email'], 'like', '%Otwell%'); $this->assertSame('select * from "users" where "first_name" like ? and not ("last_name" like ? or "email" like ?)', $builder->toSql()); $this->assertEquals(['%Taylor%', '%Otwell%', '%Otwell%'], $builder->getBindings()); + + $builder = $this->getBuilder(); + $builder->select('*')->from('users')->whereNone([ + fn(Builder $query) => $query->where('last_name', 'like', '%Otwell%'), + fn(Builder $query) => $query->where('email', 'like', '%Otwell%'), + ]); + $this->assertSame('select * from "users" where not (("last_name" like ?) or ("email" like ?))', $builder->toSql()); + $this->assertEquals(['%Otwell%', '%Otwell%'], $builder->getBindings()); } public function testOrWhereNone() @@ -1410,6 +1450,14 @@ public function testOrWhereNone() $builder->select('*')->from('users')->where('first_name', 'like', '%Taylor%')->orWhereNone(['last_name', 'email'], '%Otwell%'); $this->assertSame('select * from "users" where "first_name" like ? or not ("last_name" = ? or "email" = ?)', $builder->toSql()); $this->assertEquals(['%Taylor%', '%Otwell%', '%Otwell%'], $builder->getBindings()); + + $builder = $this->getBuilder(); + $builder->select('*')->from('users')->where('first_name', 'like', '%Taylor%')->orWhereNone([ + fn(Builder $query) => $query->where('last_name', 'like', '%Otwell%'), + fn(Builder $query) => $query->where('email', 'like', '%Otwell%'), + ]); + $this->assertSame('select * from "users" where "first_name" like ? or not (("last_name" like ?) or ("email" like ?))', $builder->toSql()); + $this->assertEquals(['%Taylor%', '%Otwell%', '%Otwell%'], $builder->getBindings()); } public function testUnions()