PHPackages                             vkovic/laravel-model-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. vkovic/laravel-model-meta

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

vkovic/laravel-model-meta
=========================

Laravel model meta storage

v1.0.1(6y ago)47413MITPHPPHP ^7.1CI failing

Since Dec 17Pushed 6y ago1 watchersCompare

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

READMEChangelog (1)Dependencies (5)Versions (10)Used By (0)

Laravel Model Meta
==================

[](#laravel-model-meta)

[![Build](https://camo.githubusercontent.com/86165eefa2dd2d3a3eb1a7ce4ec472d9861b0a921602eff0530e72eb7629a6fa/68747470733a2f2f6170692e7472617669732d63692e6f72672f766b6f7669632f6c61726176656c2d6d6f64656c2d6d6574612e7376673f6272616e63683d6d6173746572)](https://travis-ci.org/vkovic/laravel-model-meta)[![Downloads](https://camo.githubusercontent.com/3e379a5dc8a1c7e27cb94e0b566d6d6d79e6ccaf1fe49cce7b151d9c2045b7e7/68747470733a2f2f706f7365722e707567782e6f72672f766b6f7669632f6c61726176656c2d6d6f64656c2d6d6574612f646f776e6c6f616473)](https://packagist.org/packages/vkovic/laravel-model-meta)[![Stable](https://camo.githubusercontent.com/6d795d20012e10ccd36e7d0ba80a16561e002ac131625f2b577cdfbee6134790/68747470733a2f2f706f7365722e707567782e6f72672f766b6f7669632f6c61726176656c2d6d6f64656c2d6d6574612f762f737461626c65)](https://packagist.org/packages/vkovic/laravel-model-meta)[![License](https://camo.githubusercontent.com/df52e85f7beb3772329a184c06351e7da76a80eaa5c18fc669c694a8f8e5ae0b/68747470733a2f2f706f7365722e707567782e6f72672f766b6f7669632f6c61726176656c2d6d6f64656c2d6d6574612f6c6963656e7365)](https://packagist.org/packages/vkovic/laravel-model-meta)

### Laravel Model meta storage

[](#laravel-model-meta-storage)

Easily store and access model related metadata and avoid cluttering your models table with more fields.

---

Compatibility
-------------

[](#compatibility)

The package is compatible with **Laravel** versions `5.5`, `5.6`, `5.7`, `5.8` and `6`.

Installation
------------

[](#installation)

Install the package via composer:

```
composer require vkovic/laravel-model-meta
```

Run migrations to create table which will be used to store our model metadata:

```
php artisan migrate
```

Simple examples
---------------

[](#simple-examples)

To be able to write metadata from our model object, we'll need to add trait `HasMetadata`to the model we want to associate metadata with. Let's take Laravel default `User` model as an example:

```
namespace App\Models;

use Illuminate\Notifications\Notifiable;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Vkovic\LaravelModelMeta\Models\Traits\HasMetadata;

class User extends Authenticatable
{
    use Notifiable, HasMetadata; // setMeta('foo', 'bar');

// Get meta value
$user->getMeta('foo'); // : 'bar'

// In case there is no metadata found for given key,
// we can pass default value to return
$user->getMeta('baz', 'default'); // : 'default'
```

Beside string, metadata can also be stored as integer, float, null, boolean or array:

```
$user->setMeta('age', 35);
$user->setMeta('temperature', 24.7);
$user->setMeta('value', null);
$user->setMeta('employed', true);
$user->setMeta('fruits', ['orange', 'apple']);

$user->getMeta('age'); // : 35
$user->getMeta('temperature'); // : 24.7
$user->getMeta('value'); // : null
$user->getMeta('employed'); // : true
$user->getMeta('fruits'); // : ['orange', 'apple']
```

We can easily check if related user meta exists without actually retrieving it from meta table:

```
$user->setMeta('foo', 'bar');

$user->metaExists('foo'); // : true
```

Counting all related user meta records is also a breeze:

```
$user->setMeta('a', 'one');
$user->setMeta('b', 'two');

$user->countMeta(); // : 2
```

If we need all user metadata, or just keys, no problem:

```
$user->setMeta('a', 'one');
$user->setMeta('b', 'two');
$user->setMeta('c', 'three');

// Get all metadata
$user->allMeta(); // : ['a' => 'one', 'b' => 'two', 'c' => 'three']

// Get only keys
$user->metaKeys(); // : [0 => 'a', 1 => 'b', 2 => 'c']
```

Also, we can remove all user meta data easily:

```
$user->setMeta('a', 'one');
$user->setMeta('b', 'two');
$user->setMeta('c', 'three');

// Remove meta by key
$user->removeMeta('a');

// Or array of keys
$user->removeMeta(['b', 'c']);
```

If, for some reason, we want to delete all meta related to this user at once, no problem:

```
$user->purgeMeta();
```

Retrieve models through meta scopes
-----------------------------------

[](#retrieve-models-through-meta-scopes)

`HasMetadata` trait also provides functionality to filter models with specific meta, let's take a look at examples below:

```
$user->setMeta('age', 35);

// Equals operator
User::whereMeta('age', '=', 35)->get();
// or shorther
User::whereMeta('age', 35)->get();

// Comparison operators
User::whereMeta('age', '>', 18)->get();
User::whereMeta('age', '!=', 20)->get();
// or with other comparison operators (=, =, , !=)

// All of the examples above will return Collection of users which meet's criteria,
// in this case our $user
```

Beside filtering users against meta value, we can also perform filtering based on meta key:

```
$user->setMeta('company', 'Acme');
$anotherUser->setMeta('role', 'admin');

// Meta key
User::whereHasMetaKey('manager')->get();

// Array of keys
User::whereHasMetaKey(['company', 'role'])->get();

// All of the examples above will return Collection of users which meet's criteria,
// in this case our $user and $anotherUser
```

Check if model has metadata
---------------------------

[](#check-if-model-has-metadata)

If you need to check if model has metadata functionality, you can implement an interface that comes with the package like:

```
namespace App\Models;

use Illuminate\Foundation\Auth\User as Authenticatable;
use Vkovic\LaravelModelMeta\Models\Interfaces\HasMetadataInterface;

class User extends Authenticatable implements HasMetadataInterface //
