From ed0296790bf2088775ea2dd6efe921c53b33b317 Mon Sep 17 00:00:00 2001 From: Joseph Silber Date: Wed, 14 Dec 2016 09:51:14 -0500 Subject: [PATCH] Add operator support to the "contains" method (#16791) --- .../Database/Eloquent/Collection.php | 11 ++++------ src/Illuminate/Support/Collection.php | 21 ++++++++++++------- .../DatabaseEloquentCollectionTest.php | 9 ++++++++ tests/Support/SupportCollectionTest.php | 10 +++++++++ 4 files changed, 36 insertions(+), 15 deletions(-) diff --git a/src/Illuminate/Database/Eloquent/Collection.php b/src/Illuminate/Database/Eloquent/Collection.php index 9842cc758200..ac99b63c92a2 100755 --- a/src/Illuminate/Database/Eloquent/Collection.php +++ b/src/Illuminate/Database/Eloquent/Collection.php @@ -65,17 +65,14 @@ public function add($item) * Determine if a key exists in the collection. * * @param mixed $key + * @param mixed $operator * @param mixed $value * @return bool */ - public function contains($key, $value = null) + public function contains($key, $operator = null, $value = null) { - if (func_num_args() == 2) { - return parent::contains($key, $value); - } - - if ($this->useAsCallable($key)) { - return parent::contains($key); + if (func_num_args() > 1 || $this->useAsCallable($key)) { + return parent::contains(...func_get_args()); } $key = $key instanceof Model ? $key->getKey() : $key; diff --git a/src/Illuminate/Support/Collection.php b/src/Illuminate/Support/Collection.php index fdb4c2a2c12a..d5623c6be5bf 100644 --- a/src/Illuminate/Support/Collection.php +++ b/src/Illuminate/Support/Collection.php @@ -165,22 +165,27 @@ public function collapse() * Determine if an item exists in the collection. * * @param mixed $key + * @param mixed $operator * @param mixed $value * @return bool */ - public function contains($key, $value = null) + public function contains($key, $operator = null, $value = null) { - if (func_num_args() == 2) { - return $this->contains(function ($item) use ($key, $value) { - return data_get($item, $key) == $value; - }); + if (func_num_args() == 1) { + if ($this->useAsCallable($key)) { + return ! is_null($this->first($key)); + } + + return in_array($key, $this->items); } - if ($this->useAsCallable($key)) { - return ! is_null($this->first($key)); + if (func_num_args() == 2) { + $value = $operator; + + $operator = '='; } - return in_array($key, $this->items); + return $this->contains($this->operatorForWhere($key, $operator, $value)); } /** diff --git a/tests/Database/DatabaseEloquentCollectionTest.php b/tests/Database/DatabaseEloquentCollectionTest.php index b7c8c1cd1f57..649d1126a322 100755 --- a/tests/Database/DatabaseEloquentCollectionTest.php +++ b/tests/Database/DatabaseEloquentCollectionTest.php @@ -30,6 +30,15 @@ public function testGettingMinItemsFromCollection() $this->assertEquals(10, $c->min('foo')); } + public function testContainsWithMultipleArguments() + { + $c = new Collection([['id' => 1], ['id' => 2]]); + + $this->assertTrue($c->contains('id', 1)); + $this->assertTrue($c->contains('id', '>=', 2)); + $this->assertFalse($c->contains('id', '>', 2)); + } + public function testContainsIndicatesIfModelInArray() { $mockModel = m::mock('Illuminate\Database\Eloquent\Model'); diff --git a/tests/Support/SupportCollectionTest.php b/tests/Support/SupportCollectionTest.php index 0b81195171aa..acbab00b913e 100755 --- a/tests/Support/SupportCollectionTest.php +++ b/tests/Support/SupportCollectionTest.php @@ -1244,6 +1244,16 @@ public function testContainsStrict() $this->assertTrue($c->containsStrict('')); } + public function testContainsWithOperator() + { + $c = new Collection([['v' => 1], ['v' => 3], ['v' => '4'], ['v' => 5]]); + + $this->assertTrue($c->contains('v', '=', 4)); + $this->assertTrue($c->contains('v', '==', 4)); + $this->assertFalse($c->contains('v', '===', 4)); + $this->assertTrue($c->contains('v', '>', 4)); + } + public function testGettingSumFromCollection() { $c = new Collection([(object) ['foo' => 50], (object) ['foo' => 50]]);