From 7667cd511ee7982a7b8bb60234856482c141dfb5 Mon Sep 17 00:00:00 2001 From: Martiros Date: Tue, 3 Mar 2015 01:18:53 +0400 Subject: [PATCH] Allow define hidden/visible options dynamically. --- src/Illuminate/Database/Eloquent/Model.php | 8 +-- tests/Database/DatabaseEloquentModelTest.php | 68 ++++++++++++++++++++ 2 files changed, 72 insertions(+), 4 deletions(-) diff --git a/src/Illuminate/Database/Eloquent/Model.php b/src/Illuminate/Database/Eloquent/Model.php index 375e70a35051..f1f2d10e157e 100755 --- a/src/Illuminate/Database/Eloquent/Model.php +++ b/src/Illuminate/Database/Eloquent/Model.php @@ -2472,7 +2472,7 @@ public function relationsToArray() foreach ($this->getArrayableRelations() as $key => $value) { - if (in_array($key, $this->hidden)) continue; + if (in_array($key, $this->getHidden())) continue; // If the values implements the Arrayable interface we can just call this // toArray method on the instances which will convert both models and @@ -2530,12 +2530,12 @@ protected function getArrayableRelations() */ protected function getArrayableItems(array $values) { - if (count($this->visible) > 0) + if (count($this->getVisible()) > 0) { - return array_intersect_key($values, array_flip($this->visible)); + return array_intersect_key($values, array_flip($this->getVisible())); } - return array_diff_key($values, array_flip($this->hidden)); + return array_diff_key($values, array_flip($this->getHidden())); } /** diff --git a/tests/Database/DatabaseEloquentModelTest.php b/tests/Database/DatabaseEloquentModelTest.php index 6aa2cccc47ba..9621c0b2a581 100755 --- a/tests/Database/DatabaseEloquentModelTest.php +++ b/tests/Database/DatabaseEloquentModelTest.php @@ -686,6 +686,56 @@ public function testToArrayUsesMutators() } + public function testHidden() + { + $model = new EloquentModelStub(['name' => 'foo', 'age' => 'bar', 'id' => 'baz']); + $model->setHidden(['age', 'id']); + $array = $model->toArray(); + $this->assertArrayHasKey('name', $array); + $this->assertArrayNotHasKey('age', $array); + } + + + public function testVisible() + { + $model = new EloquentModelStub(['name' => 'foo', 'age' => 'bar', 'id' => 'baz']); + $model->setVisible(['name', 'id']); + $array = $model->toArray(); + $this->assertArrayHasKey('name', $array); + $this->assertArrayNotHasKey('age', $array); + } + + + public function testHiddenAreIgnoringWhenVisibleExists() + { + $model = new EloquentModelStub(['name' => 'foo', 'age' => 'bar', 'id' => 'baz']); + $model->setVisible(['name', 'id']); + $model->setHidden(['name', 'age']); + $array = $model->toArray(); + $this->assertArrayHasKey('name', $array); + $this->assertArrayHasKey('id', $array); + $this->assertArrayNotHasKey('age', $array); + } + + + public function testDynamicHidden() + { + $model = new EloquentModelDynamicHiddenStub(['name' => 'foo', 'age' => 'bar', 'id' => 'baz']); + $array = $model->toArray(); + $this->assertArrayHasKey('name', $array); + $this->assertArrayNotHasKey('age', $array); + } + + + public function testDynamicVisible() + { + $model = new EloquentModelDynamicVisibleStub(['name' => 'foo', 'age' => 'bar', 'id' => 'baz']); + $array = $model->toArray(); + $this->assertArrayHasKey('name', $array); + $this->assertArrayNotHasKey('age', $array); + } + + public function testFillable() { $model = new EloquentModelStub; @@ -1338,3 +1388,21 @@ public function eighthAttributeValue() return $this->attributes['eighth']; } } + +class EloquentModelDynamicHiddenStub extends Illuminate\Database\Eloquent\Model { + protected $table = 'stub'; + protected $guarded = []; + public function getHidden() + { + return ['age', 'id']; + } +} + +class EloquentModelDynamicVisibleStub extends Illuminate\Database\Eloquent\Model { + protected $table = 'stub'; + protected $guarded = []; + public function getVisible() + { + return ['name', 'id']; + } +}