Skip to content

Commit 3cde539

Browse files
storyn26383taylorotwell
authored andcommitted
[5.4] fix eloquent collection contains issue (#19568)
* fix eloquent collection contains issue * use $model->is($key) instead * remove useless code
1 parent 11fe874 commit 3cde539

File tree

2 files changed

+25
-4
lines changed

2 files changed

+25
-4
lines changed

src/Illuminate/Database/Eloquent/Collection.php

+5-1
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,11 @@ public function contains($key, $operator = null, $value = null)
8383
return parent::contains(...func_get_args());
8484
}
8585

86-
$key = $key instanceof Model ? $key->getKey() : $key;
86+
if ($key instanceof Model) {
87+
return parent::contains(function ($model) use ($key) {
88+
return $model->is($key);
89+
});
90+
}
8791

8892
return parent::contains(function ($model) use ($key) {
8993
return $model->getKey() == $key;

tests/Database/DatabaseEloquentCollectionTest.php

+20-3
Original file line numberDiff line numberDiff line change
@@ -45,18 +45,35 @@ public function testContainsWithMultipleArguments()
4545
public function testContainsIndicatesIfModelInArray()
4646
{
4747
$mockModel = m::mock('Illuminate\Database\Eloquent\Model');
48-
$mockModel->shouldReceive('getKey')->andReturn(1);
48+
$mockModel->shouldReceive('is')->with($mockModel)->andReturn(true);
49+
$mockModel->shouldReceive('is')->andReturn(false);
4950
$mockModel2 = m::mock('Illuminate\Database\Eloquent\Model');
50-
$mockModel2->shouldReceive('getKey')->andReturn(2);
51+
$mockModel2->shouldReceive('is')->with($mockModel2)->andReturn(true);
52+
$mockModel2->shouldReceive('is')->andReturn(false);
5153
$mockModel3 = m::mock('Illuminate\Database\Eloquent\Model');
52-
$mockModel3->shouldReceive('getKey')->andReturn(3);
54+
$mockModel3->shouldReceive('is')->with($mockModel3)->andReturn(true);
55+
$mockModel3->shouldReceive('is')->andReturn(false);
5356
$c = new Collection([$mockModel, $mockModel2]);
5457

5558
$this->assertTrue($c->contains($mockModel));
5659
$this->assertTrue($c->contains($mockModel2));
5760
$this->assertFalse($c->contains($mockModel3));
5861
}
5962

63+
public function testContainsIndicatesIfDiffentModelInArray()
64+
{
65+
$mockModelFoo = m::namedMock('Foo', 'Illuminate\Database\Eloquent\Model');
66+
$mockModelFoo->shouldReceive('is')->with($mockModelFoo)->andReturn(true);
67+
$mockModelFoo->shouldReceive('is')->andReturn(false);
68+
$mockModelBar = m::namedMock('Bar', 'Illuminate\Database\Eloquent\Model');
69+
$mockModelBar->shouldReceive('is')->with($mockModelBar)->andReturn(true);
70+
$mockModelBar->shouldReceive('is')->andReturn(false);
71+
$c = new Collection([$mockModelFoo]);
72+
73+
$this->assertTrue($c->contains($mockModelFoo));
74+
$this->assertFalse($c->contains($mockModelBar));
75+
}
76+
6077
public function testContainsIndicatesIfKeyedModelInArray()
6178
{
6279
$mockModel = m::mock('Illuminate\Database\Eloquent\Model');

0 commit comments

Comments
 (0)