necenzurat / eloquent-meta
Fluent Meta Data for Eloquent Models, as if it is a property on your model.
Installs: 8 039
Dependents: 0
Suggesters: 0
Security: 0
Stars: 2
Watchers: 3
Forks: 0
Open Issues: 0
Requires
- php: ^7.2.5|^8.0
- illuminate/support: ~5.8.0|^6.0|^7.0|^8.0
Requires (Dev)
- arubacao/php-cs-fixer-config: ^0.1.0
README
A fork from kodeine/laravel-meta updated and compatible with Laravel 5.x (including 5.5)
Metable Trait adds the ability to access meta data as if it is a property on your model. Metable is Fluent, just like using an eloquent model attribute you can set or unset metas. Follow along the documentation to find out more.
Installation
Composer
Add this to your composer.json file, in the require object:
composer require necenzurat/eloquent-meta
After that, run composer install to install the package.
Todo: make an generator for this
Migration Table Schema
/** * Run the migrations. * * @return void */ public function up() { Schema::create('MODEL_meta', function (Blueprint $table) { $table->increments('id'); $table->integer('model_id')->unsigned()->index(); $table->foreign('model_id')->references('id')->on('MODEL')->onDelete('cascade'); $table->string('type')->default('null'); $table->string('key')->index(); $table->text('value')->nullable(); $table->timestamps(); }); } /** * Reverse the migrations. * * @return void */ public function down() { Schema::drop('MODEL_meta'); }
Configuration
Model Setup
Next, add the Metable
trait to each of your metable model definition:
use necenzurat\EloquentMeta\Metable; class Post extends Eloquent { use Metable; }
Metable Trait will automatically set the meta table based on your model name.
Default meta table name would be, model_meta
.
In case you need to define your own meta table name, you can specify in model:
class Post extends Eloquent { protected $metaTable = 'model_meta'; //optional. }
Gotcha
When you extend a model and still want to use the same meta table you must override getMetaKeyName
function.
class Post extends Eloquent
{
}
class Slideshow extends Post
{
protected function getMetaKeyName()
{
return 'post_id' // The parent foreign key
}
}
Working With Meta
Setting Content Meta
To set a meta value on an existing piece of content or create a new data:
Fluent way, You can set meta flawlessly as you do on your regular eloquent models. Metable checks if attribute belongs to model, if not it will access meta model to append or set a new meta.
$post = Post::find(1); $post->name = 'hello world'; // model attribute $post->content = 'some content goes here'; // meta data attribute $post->save(); // save attributes to respective tables
Or
$post = Post::find(1); $post->name = 'hello world'; // model attribute $post->setMeta('content', 'Some content here'); $post->save();
Or set multiple metas
at once:
... $post->setMeta([ 'content' => 'Some content here', 'views' => 1, ]); $post->save();
Note: If a piece of content already has a meta the existing value will be updated.
Unsetting Content Meta
Similarly, you may unset meta from an existing piece of content:
Fluent way to unset.
$post = Post::find(1); $post->name // model attribute unset($post->content) // delete meta on save $post->save();
Or
$post->unsetMeta('content'); $post->save();
Or unset multiple metas
at once:
$post->unsetMeta('content,views'); // or $post->unsetMeta('content|views'); // or $post->unsetMeta('content', 'views'); // or array $post->unsetMeta(['content', 'views']); $post->save();
Note: The system will not throw an error if the content does not have the requested meta.
Checking for Metas
To see if a piece of content has a meta:
Fluent way, Metable is clever enough to understand $post->content is an attribute of meta.
if (isset($post->content)) { }
Retrieving Meta
To retrieve a meta value on a piece of content, use the getMeta
method:
Fluent way, You can access meta data as if it is a property on your model. Just like you do on your regular eloquent models.
$post = Post::find(1); dump($post->name); dump($post->content); // will access meta.
Or
$post = $post->getMeta('content');
Or specify a default value, if not set:
$post = $post->getMeta('content', 'Something');
You may also retrieve more than one meta at a time and get an illuminate collection:
// using comma or pipe $post = $post->getMeta('content|views'); // or an array $post = $post->getMeta(['content', 'views']);
Retrieving All Metas
To fetch all metas associated with a piece of content, use the getMeta
without any params
$metas = $post->getMeta();
Retrieving an Array of All Metas
To fetch all metas associated with a piece of content and return them as an array, use the toArray
method:
$metas = $post->getMeta()->toArray();
Meta Table Join
When you need to filter your model based on the meta data , you can use meta
scope in Eloquent Query Builder.
$post = Post::meta() ->where(function($query){ $query->where('posts_meta.key', '=', 'revision') ->where('posts_meta.value', '=', 'draft'); })
Eager Loading
When you need to retrive multiple results from your model, you can eager load metas
$post = Post::with(['meta'])->get();