A simple package for tagging Eloquent models in Laravel. This package is a sibling of Laravel Categories, which can be used to categorise Eloquent models. The API is the same as this one.
- Install using Composer
composer require robotsinside/laravel-tags
- Register the service provider in
config/app.php
/*
* Package Service Providers...
*/
\RobotsInside\Tags\TagsServiceProvider::class,
Auto-discovery is enabled, so this step can be skipped.
- Publish the migrations
php artisan vendor:publish --provider="RobotsInside\Tags\TagsServiceProvider" --tag="migrations"
- Migrate the database. This will create two new tables;
tags
andtaggables
php artisan migrate
Use the RobotsInside\Tags\Taggable
trait in your models.
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
use RobotsInside\Tags\Taggable;
class Post extends Model
{
use Taggable;
}
You are now ready to start tagging. Models can be tagged by passing an integer, array of integers, a model instance or a collection of models.
<?php
use App\Post;
use Illuminate\Support\Facades\Route;
use RobotsInside\Tags\Models\Tag;
Route::get('/', function () {
// Retrieve a new or existing tag
$tag1 = (new Tag())->resolve('Tag 1');
$tag2 = (new Tag())->resolve('Tag 2');
// Or, retrieve a collection of new or existing tags
$tags = (new Tag())->resolveAll(['Tag 1', 'Tag 2', 'Tag 3'])
$post = new Post();
$post->title = 'My blog';
$post->save();
$post->tag($tag1);
// Or
$post->tag(['tag-1']);
// Or
$post->tag([1, 2]);
// Or
$post->tag(Tag::get());
});
Untagging models is just as simple.
<?php
use App\Post;
use Illuminate\Support\Facades\Route;
use RobotsInside\Tags\Models\Tag;
Route::get('/', function () {
$tag1 = Tag::find(1);
$post = Post::where('title', 'My blog')->first();
$post->untag($tag1);
// Or
$post->untag(['tag-1']);
// Or
$post->untag([1, 2]);
// Or
$post->untag(Tag::get());
// Or
$post->untag(); // remove all tags
});
Each time a RobotsInside\Tags\Models\Tag
is used, the count
column in the tags
table is incremented. When a tag is removed, the count is decremented until it is zero.
This packages comes with a number of pre-defined scopes to make queries against the count
column easier, namely >=
, >
, <=
and <
contstrains, for example:
Tag::usedGte(1);
Tag::usedGt(2);
Tag::usedLte(3);
Tag::usedLt(4);
In addition, a scope on the Taggable
model is provided to constrain records created within the given time frame. This scope supports human readable values including days
, months
and years
in both singular and plural formats, for example:
Taggable::taggedWithin('7 days');
Taggable::taggedWithin('1 month');
Taggable::taggedWithin('2 years');
If you discover any security related issues, please email robertfrancken@gmail.com instead of using the issue tracker.
Will work for ☕☕☕
The MIT License (MIT). Please see License File for more information.