From f109e48dcfa10465dfb6b3ae2b4087d3214edfa8 Mon Sep 17 00:00:00 2001 From: Joseph Silber Date: Mon, 19 Jan 2015 15:13:42 -0500 Subject: [PATCH] findOrFail should throw an error when any model is missing --- src/Illuminate/Database/Eloquent/Builder.php | 13 +++++++++++-- src/Illuminate/Database/Eloquent/Model.php | 4 +--- tests/Database/DatabaseEloquentBuilderTest.php | 14 +++++++++++++- tests/Database/DatabaseEloquentModelTest.php | 5 +++-- 4 files changed, 28 insertions(+), 8 deletions(-) diff --git a/src/Illuminate/Database/Eloquent/Builder.php b/src/Illuminate/Database/Eloquent/Builder.php index 2109667e6d99..72ec84780526 100755 --- a/src/Illuminate/Database/Eloquent/Builder.php +++ b/src/Illuminate/Database/Eloquent/Builder.php @@ -105,13 +105,22 @@ public function findMany($id, $columns = array('*')) * * @param mixed $id * @param array $columns - * @return \Illuminate\Database\Eloquent\Model|static + * @return \Illuminate\Database\Eloquent\Model|\Illuminate\Database\Eloquent\Collection * * @throws \Illuminate\Database\Eloquent\ModelNotFoundException */ public function findOrFail($id, $columns = array('*')) { - if ( ! is_null($model = $this->find($id, $columns))) return $model; + $result = $this->find($id, $columns); + + if (is_array($id)) + { + if (count($result) == count(array_unique($id))) return $result; + } + elseif ( ! is_null($result)) + { + return $result; + } throw (new ModelNotFoundException)->setModel(get_class($this->model)); } diff --git a/src/Illuminate/Database/Eloquent/Model.php b/src/Illuminate/Database/Eloquent/Model.php index 3b608ecd4071..52ea4d582e74 100755 --- a/src/Illuminate/Database/Eloquent/Model.php +++ b/src/Illuminate/Database/Eloquent/Model.php @@ -725,9 +725,7 @@ public static function findOrNew($id, $columns = array('*')) */ public static function findOrFail($id, $columns = array('*')) { - if ( ! is_null($model = static::find($id, $columns))) return $model; - - throw (new ModelNotFoundException)->setModel(get_called_class()); + return static::query()->findOrFail($id, $columns); } /** diff --git a/tests/Database/DatabaseEloquentBuilderTest.php b/tests/Database/DatabaseEloquentBuilderTest.php index 35a7873328a5..5504c5397905 100755 --- a/tests/Database/DatabaseEloquentBuilderTest.php +++ b/tests/Database/DatabaseEloquentBuilderTest.php @@ -68,6 +68,18 @@ public function testFindOrFailMethodThrowsModelNotFoundException() $result = $builder->findOrFail('bar', array('column')); } + /** + * @expectedException Illuminate\Database\Eloquent\ModelNotFoundException + */ + public function testFindOrFailMethodWithManyThrowsModelNotFoundException() + { + $builder = m::mock('Illuminate\Database\Eloquent\Builder[get]', array($this->getMockQueryBuilder())); + $builder->setModel($this->getMockModel()); + $builder->getQuery()->shouldReceive('whereIn')->once()->with('foo_table.foo', [1, 2]); + $builder->shouldReceive('get')->with(array('column'))->andReturn(new Collection([1])); + $result = $builder->findOrFail([1, 2], array('column')); + } + /** * @expectedException Illuminate\Database\Eloquent\ModelNotFoundException */ @@ -437,7 +449,7 @@ public function testHasNestedWithConstraints() $this->assertEquals($builder, $result); } - + public function testHasNested() { $model = new EloquentBuilderTestModelParentStub; diff --git a/tests/Database/DatabaseEloquentModelTest.php b/tests/Database/DatabaseEloquentModelTest.php index 126dbabc6630..f3b62b1d2808 100755 --- a/tests/Database/DatabaseEloquentModelTest.php +++ b/tests/Database/DatabaseEloquentModelTest.php @@ -1,6 +1,7 @@ shouldReceive('find')->once()->with(1, array('*'))->andReturn(null); + $mock->shouldReceive('findOrFail')->once()->with(1, array('*'))->andThrow(new ModelNotFoundException); return $mock; } }