macsidigital / laravel-eloquent-extended
Eloquent extended is a library to add some additional functions to laravel eloquent
Fund package maintenance!
MacsiDigital
Requires
- php: ^8.1|^8.2
- laravel/framework: ^10.0|^11.0
Requires (Dev)
- orchestra/testbench: ^8.0|^9.0
- phpunit/phpunit: ^10.0|^11.0
README
Extended model attributes, Mulit Language attributes and Slugs
Extended Eloquent Models, mainly for JSON and Multi Language Content
Support us
We invest a lot in creating open source packages, and would be grateful for a sponsor if you make money from your product that uses them.
Installation
You can install the package via composer:
composer require macsidigital/laravel-eloquent-extended
Usage
To use extended we just need to add the trait and add a protected extendedAttributes variable like so
use Extended\Traits\IsExtended; use Illuminate\Database\Eloquent\Model; class TestExtendedModel extends Model { use IsExtended; protected $extendedAttributes = [ 'test_field', ]; }
Once set it will act like a normal field
$test = new model; $test->test_field = 'something'; echo $test->test_field;
Content
To use content is similar with the exception that we can set languages
use Extended\Traits\IsExtended; use Extended\Traits\HasContent; use Illuminate\Database\Eloquent\Model; class TestExtendedModel extends Model { use IsExtended, HasContent; protected $contentAttributes = [ 'test_content_field', ]; }
Once set it will act like a normal field
$test = new model; $test->test_content_field = 'something'; echo $test->test_content_field;
We can set and get different languages like so
$test = new model; $test->test_content_field = 'something'; $test->setContentLanguage('de'); $test->test_content_field = 'something DE'; $test->setContentLanguage('en'); echo $test->test_content_field; // 'something' $test->setContentLanguage('de'); echo $test->test_content_field; // 'something DE'
Slugs
We can use Multiple Language Slugs by adding both HasContent and HasSlug traits and setting the slug fields.
use Extended\Traits\HasSlug; use Extended\Traits\IsExtended; use Extended\Traits\HasContent; use Illuminate\Database\Eloquent\Model; class TestExtendedModel extends Model { use IsExtended, HasContent, HasSlug; protected $contentAttributes = [ 'uri', ]; protected $findSlugField = 'extended->uri'; protected $slugField = 'uri'; }
You can then add the uri like so
$test = new model; $test->uri = 'something'; echo $test->uri; //esomething
To ensure there are no duplicate slugs you can use the method createSlug like so
$test = new model; $test->createSlug('Test Something'); echo $test->uri; //test-something $test = new model; $test->createSlug('Test Something'); echo $test->uri; //test-something-h58s
We can set and get different languages like so
$test = new model; $test->uri = 'something'; $test->setLanguage('de'); $test->uri = 'something-de'; $test->setMetaLanguage('en'); echo $test->uri; // 'something' $test->setMetaLanguage('de'); echo $test->uri; // 'something-de'
We can then retrieve by the slug with the withSlug scoped query method
$test = new model; $test->createSlug('something'); $model = model::withSlug('something')->first() echo $model->uri; // 'something'
There is also a reversed function to get all models without the slug
$test = new model; $test->createSlug('something'); $test = new model; $test->createSlug('something-1234'); $model = model::withoutSlug('something')->first() echo $model->uri; // 'something-1234'
We can also use slugs outside of the multi language scope, just set to a normal database field.
use Extended\Traits\HasSlug; use Extended\Traits\IsExtended; use Extended\Traits\HasContent; use Illuminate\Database\Eloquent\Model; class TestExtendedModel extends Model { use HasSlug; protected $findSlugField = 'uri'; protected $slugField = 'uri'; }
Then all functions will work as previous
Route Model Binding
You can use {item:slug} in routes to automatically retrieve items by their slug. Just remember to Typehint the model in the controller/Route action.
Testing
We have a test suite testing our implementations, to use just run phpunit
composer test
Changelog
Please see CHANGELOG for more information what has changed recently.
Contributing
Please see CONTRIBUTING for details.
Security
If you discover any security-related issues, please email info@macsi.co.uk instead of using the issue tracker.
Credits
License
The MIT License (MIT). Please see License File for more information.