diff --git a/src/HashidScope.php b/src/HashidScope.php index 0228a83..48d90c4 100644 --- a/src/HashidScope.php +++ b/src/HashidScope.php @@ -15,17 +15,17 @@ public function apply(Builder $builder, Model $model) public function extend(Builder $builder) { - $builder->macro('findByHashid', function (Builder $builder, $hashid) { + $builder->macro('findByHashid', function (Builder $builder, $hashid, $columns = ['*']) { $id = $builder->getModel()->hashidToId($hashid); - return $builder->find($id); + return $builder->find($id, $columns); }); - $builder->macro('findByHashidOrFail', function (Builder $builder, $hashid) + $builder->macro('findByHashidOrFail', function (Builder $builder, $hashid, $columns = ['*']) { $id = $builder->getModel()->hashidToId($hashid); - return $builder->findOrFail($id); + return $builder->findOrFail($id, $columns); }); } } \ No newline at end of file diff --git a/tests/HasHashidTest.php b/tests/HasHashidTest.php index c99c11b..78f9e39 100644 --- a/tests/HasHashidTest.php +++ b/tests/HasHashidTest.php @@ -123,4 +123,45 @@ public function it_can_handle_invalid_hashids_properly() $this->expectException(ModelNotFoundException::class); Item::findByHashidOrFail('not a hashid'); } + + /** + * @test + */ + public function it_can_find_a_model_by_its_hashid_with_specific_columns() + { + $item = factory(Item::class)->create(); + + $hashid = Hashids::encode($item->getKey()); + + $selectedColumns = ['id']; + + $found = Item::findByHashid($hashid, $selectedColumns); + + $this->assertNotNull($found); + $this->assertEquals($item->id, $found->id); + $this->assertEquals($selectedColumns, array_keys($found->getAttributes())); + } + + /** + * @test + */ + public function it_can_find_a_model_by_its_hashid_with_specific_columns_or_fail() + { + $item = factory(Item::class)->create(); + + $hashid = Hashids::encode($item->getKey()); + + $selectedColumns = ['id']; + + $found = Item::findByHashidOrFail($hashid, $selectedColumns); + + $this->assertEquals($item->id, $found->id); + $this->assertEquals($selectedColumns, array_keys($found->getAttributes())); + + $item->delete(); + + $this->expectException(ModelNotFoundException::class); + + Item::findByHashidOrFail($hashid); + } }