PHPackages                             dhcmega/laravel-meta - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Database &amp; ORM](/categories/database)
4. /
5. dhcmega/laravel-meta

ActiveLibrary[Database &amp; ORM](/categories/database)

dhcmega/laravel-meta
====================

Fork from kodeine/laravel-meta. Fluent Meta Data for Eloquent Models, as if it is a property on your model.

1.0.0(6y ago)05MITPHPPHP &gt;=5.4.0

Since Sep 28Pushed 4y agoCompare

[ Source](https://github.com/dhcmega/laravel-meta)[ Packagist](https://packagist.org/packages/dhcmega/laravel-meta)[ RSS](/packages/dhcmega-laravel-meta/feed)WikiDiscussions master Synced today

READMEChangelogDependencies (1)Versions (2)Used By (0)

Fluent Meta Data for Eloquent Models
====================================

[](#fluent-meta-data-for-eloquent-models)

[![Laravel](https://camo.githubusercontent.com/617de9936c8f5cf9445121bfecd60bab3acbd0fc8aa7424adaee4f86cf11de44/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4c61726176656c2d7e382e302d677265656e2e7376673f7374796c653d666c61742d737175617265)](http://laravel.com)[![Source](https://camo.githubusercontent.com/23388f4cddf7a7a045716b5ac4c68dedc7947c2b33102aba548df3cde0ae8e2e/687474703a2f2f696d672e736869656c64732e696f2f62616467652f736f757263652d6b6f6465696e652f6c61726176656c2d2d6d6574612d626c75652e7376673f7374796c653d666c61742d737175617265)](https://github.com/dhcmega/laravel-meta/)[![Build Status](https://camo.githubusercontent.com/f68fb93b5f112eb1366b9d78123b99058df3aeb88b36bdf5d4e6684ed982cdc9/687474703a2f2f696d672e736869656c64732e696f2f7472617669732f6b6f6465696e652f6c61726176656c2d2d6d6574612f6d61737465722e7376673f7374796c653d666c61742d737175617265)](https://travis-ci.org/dhcmega/laravel-meta)[![License](https://camo.githubusercontent.com/30597ff9a350144f03bffdd9183e16468e0b3ca1193e1d08591d992622738d55/687474703a2f2f696d672e736869656c64732e696f2f62616467652f6c6963656e73652d4d49542d627269676874677265656e2e7376673f7374796c653d666c61742d737175617265)](https://tldrlegal.com/license/mit-license)

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
------------

[](#installation)

#### Composer

[](#composer)

Add this to your composer.json file, in the require object:

```
"dhcmega/laravel-meta": "master"
```

After that, run composer install to install the package.

#### Migration Table Schema

[](#migration-table-schema)

```
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
    Schema::create('posts_meta', function (Blueprint $table) {
        $table->increments('id');

        $table->integer('post_id')->unsigned()->index();
        $table->foreign('post_id')->references('id')->on('posts')->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('posts_meta');
}
```

Configuration
-------------

[](#configuration)

#### Model Setup

[](#model-setup)

Next, add the `Metable` trait to each of your metable model definition:

```
use Dhcmega\Metable\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 = 'posts_meta'; //optional.
}
```

#### Default Model Attribute values

[](#default-model-attribute-values)

Additionally, you can set default values by setting an array called `$defaultMetaValues` on the model. Setting default has two side-effects:

1. If a meta attribute does not exist, the default value will be returned instead of `null`.
2. if you attempt to set a meta attribute to the default value, the row in the meta table will be removed, which will cause the default value to be returned, as per rule 1.

This is be the desired and expected functionality for most projects, but be aware that you may need to reimplement default functionality with your own custom accessors and mutators if this functionality does not fit your needs.

This functionality is most suited for meta entries that note exceptions to rules. For example: employees sick out of office (default value: in office), nodes taken down for maintance (default value: node up), etc. This means the table doesn't need to store data on every entry which is in the expected state, only those rows in the exceptional state, and allows the rows to have a default state upon creation without needing to add code to write it.

```
   public $defaultMetaValues = [
      'is_user_home_sick' => false,
   ];

```

#### Gotcha

[](#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
-----------------

[](#working-with-meta)

#### Setting Content 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();
```

Or `set multiple metas and columns` at once:

```
...
$post->setAttributes([
    'name' => 'hello world'; // model attribute
    '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

[](#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

[](#checking-for-metas)

To see if a piece of content has a meta:

> **Fluent way**, Metable is clever enough to understand $post-&gt;content is an attribute of meta.

```
if (isset($post->content)) {

}
```

#### Retrieving Meta

[](#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

[](#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

[](#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

[](#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

[](#eager-loading)

When you need to retrive multiple results from your model, you can eager load `metas`

```
$post = Post::with(['metas'])->get();
```

#### Prevent metas attribute from being populated

[](#prevent-metas-attribute-from-being-populated)

When you convert a model to an array (or json) and you don't need all meta fields, you can create a model's property to prevent metas from being added to the resulting array. You can also use it on eloquent relations.

```
/* Post model */
public $hideMeta = true; // Do not add metas to array
```

###  Health Score

25

—

LowBetter than 37% of packages

Maintenance20

Infrequent updates — may be unmaintained

Popularity4

Limited adoption so far

Community18

Small or concentrated contributor base

Maturity53

Maturing project, gaining track record

 Bus Factor2

2 contributors hold 50%+ of commits

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Unknown

Total

1

Last Release

2415d ago

### Community

Maintainers

![](https://www.gravatar.com/avatar/fedc868f264925e14e5bc4ce7159877079e4af75574ba3f58d786317a96decd8?d=identicon)[dhcmega](/maintainers/dhcmega)

---

Top Contributors

[![kodeine](https://avatars.githubusercontent.com/u/8620059?v=4)](https://github.com/kodeine "kodeine (42 commits)")[![dhcmega](https://avatars.githubusercontent.com/u/6719578?v=4)](https://github.com/dhcmega "dhcmega (9 commits)")[![stephandesouza](https://avatars.githubusercontent.com/u/159077?v=4)](https://github.com/stephandesouza "stephandesouza (7 commits)")[![todiadiyatmo](https://avatars.githubusercontent.com/u/2767210?v=4)](https://github.com/todiadiyatmo "todiadiyatmo (5 commits)")[![falestra](https://avatars.githubusercontent.com/u/12063138?v=4)](https://github.com/falestra "falestra (4 commits)")[![olsgreen](https://avatars.githubusercontent.com/u/1324164?v=4)](https://github.com/olsgreen "olsgreen (4 commits)")[![AoumiS](https://avatars.githubusercontent.com/u/2528896?v=4)](https://github.com/AoumiS "AoumiS (3 commits)")[![philipnewcomer](https://avatars.githubusercontent.com/u/1446874?v=4)](https://github.com/philipnewcomer "philipnewcomer (3 commits)")[![sumityadav](https://avatars.githubusercontent.com/u/169143?v=4)](https://github.com/sumityadav "sumityadav (2 commits)")[![benyanke](https://avatars.githubusercontent.com/u/4274911?v=4)](https://github.com/benyanke "benyanke (2 commits)")[![plivius](https://avatars.githubusercontent.com/u/1803825?v=4)](https://github.com/plivius "plivius (2 commits)")[![vortechron](https://avatars.githubusercontent.com/u/22893960?v=4)](https://github.com/vortechron "vortechron (1 commits)")[![ray1618](https://avatars.githubusercontent.com/u/2294555?v=4)](https://github.com/ray1618 "ray1618 (1 commits)")[![rimthong](https://avatars.githubusercontent.com/u/789140?v=4)](https://github.com/rimthong "rimthong (1 commits)")[![SebastienKPA6T](https://avatars.githubusercontent.com/u/177635074?v=4)](https://github.com/SebastienKPA6T "SebastienKPA6T (1 commits)")[![shemi](https://avatars.githubusercontent.com/u/10219407?v=4)](https://github.com/shemi "shemi (1 commits)")[![siamak2](https://avatars.githubusercontent.com/u/20032689?v=4)](https://github.com/siamak2 "siamak2 (1 commits)")[![SneherAdor](https://avatars.githubusercontent.com/u/24508783?v=4)](https://github.com/SneherAdor "SneherAdor (1 commits)")[![ChrisThompsonTLDR](https://avatars.githubusercontent.com/u/348801?v=4)](https://github.com/ChrisThompsonTLDR "ChrisThompsonTLDR (1 commits)")[![IfnotFr](https://avatars.githubusercontent.com/u/1242308?v=4)](https://github.com/IfnotFr "IfnotFr (1 commits)")

---

Tags

laraveldatamodeleloquentmetadatametameta datametaskodeinemetable

### Embed Badge

![Health badge](/badges/dhcmega-laravel-meta/health.svg)

```
[![Health](https://phpackages.com/badges/dhcmega-laravel-meta/health.svg)](https://phpackages.com/packages/dhcmega-laravel-meta)
```

###  Alternatives

[kodeine/laravel-meta

Fluent Meta Data for Eloquent Models, as if it is a property on your model.

426756.0k9](/packages/kodeine-laravel-meta)[mongodb/laravel-mongodb

A MongoDB based Eloquent model and Query builder for Laravel

7.1k7.2M71](/packages/mongodb-laravel-mongodb)[tucker-eric/eloquentfilter

An Eloquent way to filter Eloquent Models

1.8k4.8M26](/packages/tucker-eric-eloquentfilter)[dyrynda/laravel-model-uuid

This package allows you to easily work with UUIDs in your Laravel models.

4802.8M8](/packages/dyrynda-laravel-model-uuid)[spiritix/lada-cache

A Redis based, automated and scalable database caching layer for Laravel

591444.8k2](/packages/spiritix-lada-cache)[mmanos/laravel-metable

A meta package for Laravel 4 models.

142.3k](/packages/mmanos-laravel-metable)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
