https://github.com/stechstudio/laravel-record
What if Laravel's Collection and Model classes had a baby?
https://github.com/stechstudio/laravel-record
collections laravel model
Last synced: 8 months ago
JSON representation
What if Laravel's Collection and Model classes had a baby?
- Host: GitHub
- URL: https://github.com/stechstudio/laravel-record
- Owner: stechstudio
- License: mit
- Created: 2017-06-12T23:36:30.000Z (about 9 years ago)
- Default Branch: master
- Last Pushed: 2024-03-12T23:31:12.000Z (over 2 years ago)
- Last Synced: 2024-11-28T16:55:18.305Z (over 1 year ago)
- Topics: collections, laravel, model
- Language: PHP
- Homepage:
- Size: 33.2 KB
- Stars: 22
- Watchers: 4
- Forks: 1
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE.md
Awesome Lists containing this project
README
# Laravel Record
[](https://packagist.org/packages/stechstudio/laravel-record)
[](https://packagist.org/packages/stechstudio/laravel-record)
[](LICENSE.md)
I'm going to assume you already know all about Laravel's awesome [Collection](https://laravel.com/docs/5.4/collections) class,
and hopefully you've read [Refactoring to Collections](https://adamwathan.me/refactoring-to-collections/).
(If you haven't, stop what you're doing and go buy that PDF. You'll thank me later.)
I also assume you know all about [Eloquent models](https://laravel.com/docs/5.4/eloquent).
But have you ever wanted some of the functionality of a model, merged onto a collection?
This is a super small, single-class library that brings those together just a bit.
# Benefits
Starting with the Collection class, I wanted to add:
1) **Magic getter for attributes**. If you have key/value pairs in your collection, the Collection class does provide
the [get](https://laravel.com/docs/5.4/collections#method-get) method. But I'm lazy. And I like accessing my collection
with plain 'ol object notation. You know, like a model. Record lets you do `$collection->attribute`.
2) **New collection for sub-arrays**. If you hand a multi-dimensional array to `collect()` and access a nested array, it's still
just an array. Like `$collection->get('attribute')['subattribute']`. I want collections all the way down! This will turn
any sub-array into a new instance of Record, allowing you to do `$record->attribute->subattribute->as->deep->as->your->array->goes`.
And because you still have a real collection at each level, you can use all of the goodies like `$record->attribute->subattribute->count()`.
3) **Custom accessors**. Just like Eloquent, you can extend the Record class and define a custom accessor. Create a
`getFooAttribute()` method and then just use `$collection->foo` to get your custom computed attribute.
# Quick example: handling rich arrays
I find myself frequently needing to handle a multi-dimensional array, often a response from a remote web service.
This array may have attributes (like 'name' or 'id') as well as a nested collections (like 'data' or 'rows').
Consider this:
```json
{
"name" : "My Blog",
"url" : "http://foo.dev",
"posts" : [
{
"id" : 1,
"title" : "Hello World",
"content" : "...",
"comments" : [
{
"name" : "John Doe",
"email" : "john@example.com",
"content": "..."
}
]
},
{
"id" : 2,
"title" : "My second post",
"content" : "...",
"comments" : [
...
]
}
]
}
```
We can take this whole payload and navigate it quite nicely with Record:
```php
$record = record(json_decode($webServiceResponse, true));
echo $record->name; // My Blog
echo $record->posts->count(); // 2
echo $record->posts->first()->title; // Hello World
echo $record->posts->first()->comments->count(); // 1
```
Nice! At each level I get a combination Laravel's Collection class, plus some attribute goodness borrowed from Model.
Furthermore I might extend Record and create a class with custom accessors to sanitize `content`, or split the `name` into
first and last, or... you get the idea.
# Installation
You know the drill.
```
composer require stechstudio/laravel-record
```
Then you can either:
```php
$record = new STS\Record\Record([...]);
```
Or you can use the `record` helper method:
```php
$record = record([...]);
```