robotsinside / laravel-tags
A package for tagging Laravel Eloquent models.
Requires
- php: ^7.3|^8.0
- illuminate/database: ^8.0|^9.0
- illuminate/support: ^8.0|^9.0
Requires (Dev)
- orchestra/testbench: ^6.0|^7.0
- phpunit/phpunit: ^9.4
This package is auto-updated.
Last update: 2024-12-16 11:47:18 UTC
README
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.
Installation
- 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
Usage
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 });
Scopes
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');
Security
If you discover any security related issues, please email robertfrancken@gmail.com instead of using the issue tracker.
Credits
Coffee Time
Will work for ☕☕☕
License
The MIT License (MIT). Please see License File for more information.