Skip to content

Commit 8e9d24e

Browse files
authored
doesntContain on eloquent collection (#54567)
1 parent 241bab4 commit 8e9d24e

File tree

2 files changed

+39
-0
lines changed

2 files changed

+39
-0
lines changed

src/Illuminate/Database/Eloquent/Collection.php

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -335,6 +335,19 @@ public function contains($key, $operator = null, $value = null)
335335
return parent::contains(fn ($model) => $model->getKey() == $key);
336336
}
337337

338+
/**
339+
* Determine if a key does not exist in the collection.
340+
*
341+
* @param (callable(TModel, TKey): bool)|TModel|string|int $key
342+
* @param mixed $operator
343+
* @param mixed $value
344+
* @return bool
345+
*/
346+
public function doesntContain($key, $operator = null, $value = null)
347+
{
348+
return ! $this->contains(...func_get_args());
349+
}
350+
338351
/**
339352
* Get the array of primary keys.
340353
*

tests/Database/DatabaseEloquentCollectionTest.php

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,10 @@ public function testContainsWithMultipleArguments()
9090
$this->assertTrue($c->contains('id', 1));
9191
$this->assertTrue($c->contains('id', '>=', 2));
9292
$this->assertFalse($c->contains('id', '>', 2));
93+
94+
$this->assertFalse($c->doesntContain('id', 1));
95+
$this->assertFalse($c->doesntContain('id', '>=', 2));
96+
$this->assertTrue($c->doesntContain('id', '>', 2));
9397
}
9498

9599
public function testContainsIndicatesIfModelInArray()
@@ -108,6 +112,10 @@ public function testContainsIndicatesIfModelInArray()
108112
$this->assertTrue($c->contains($mockModel));
109113
$this->assertTrue($c->contains($mockModel2));
110114
$this->assertFalse($c->contains($mockModel3));
115+
116+
$this->assertFalse($c->doesntContain($mockModel));
117+
$this->assertFalse($c->doesntContain($mockModel2));
118+
$this->assertTrue($c->doesntContain($mockModel3));
111119
}
112120

113121
public function testContainsIndicatesIfDifferentModelInArray()
@@ -122,6 +130,9 @@ public function testContainsIndicatesIfDifferentModelInArray()
122130

123131
$this->assertTrue($c->contains($mockModelFoo));
124132
$this->assertFalse($c->contains($mockModelBar));
133+
134+
$this->assertFalse($c->doesntContain($mockModelFoo));
135+
$this->assertTrue($c->doesntContain($mockModelBar));
125136
}
126137

127138
public function testContainsIndicatesIfKeyedModelInArray()
@@ -136,6 +147,10 @@ public function testContainsIndicatesIfKeyedModelInArray()
136147
$this->assertTrue($c->contains(1));
137148
$this->assertTrue($c->contains(2));
138149
$this->assertFalse($c->contains(3));
150+
151+
$this->assertFalse($c->doesntContain(1));
152+
$this->assertFalse($c->doesntContain(2));
153+
$this->assertTrue($c->doesntContain(3));
139154
}
140155

141156
public function testContainsKeyAndValueIndicatesIfModelInArray()
@@ -151,6 +166,10 @@ public function testContainsKeyAndValueIndicatesIfModelInArray()
151166
$this->assertTrue($c->contains('name', 'Taylor'));
152167
$this->assertTrue($c->contains('name', 'Abigail'));
153168
$this->assertFalse($c->contains('name', 'Dayle'));
169+
170+
$this->assertFalse($c->doesntContain('name', 'Taylor'));
171+
$this->assertFalse($c->doesntContain('name', 'Abigail'));
172+
$this->assertTrue($c->doesntContain('name', 'Dayle'));
154173
}
155174

156175
public function testContainsClosureIndicatesIfModelInArray()
@@ -167,6 +186,13 @@ public function testContainsClosureIndicatesIfModelInArray()
167186
$this->assertFalse($c->contains(function ($model) {
168187
return $model->getKey() > 2;
169188
}));
189+
190+
$this->assertFalse($c->doesntContain(function ($model) {
191+
return $model->getKey() < 2;
192+
}));
193+
$this->assertTrue($c->doesntContain(function ($model) {
194+
return $model->getKey() > 2;
195+
}));
170196
}
171197

172198
public function testFindMethodFindsModelById()

0 commit comments

Comments
 (0)