foodineers / laravel-tag
Laravel Package for Tagging Users
Requires
- php: ^8.5
- illuminate/contracts: ^12.0||^13.0
- spatie/laravel-package-tools: ^1.16
Requires (Dev)
README
A Laravel package for tagging Eloquent models. Add the HasTags trait to any model and start tagging.
Installation
composer require foodineers/laravel-tag
Publish the config and migrations, then migrate:
php artisan vendor:publish --tag="tag-config" php artisan vendor:publish --tag="tag-migrations" php artisan migrate
Set the taggable model in config/tag.php (defaults to App\Models\User):
'taggable_model' => App\Models\User::class,
Add the HasTags trait to your model (e.g. User):
use Foodineers\Tag\Traits\HasTags; use Illuminate\Database\Eloquent\Model; class User extends Model { use HasTags; }
That's it. Your model can now be tagged.
API Reference
HasTags Trait
Add to any Eloquent model that should be taggable.
tags() — BelongsToMany relation
Returns the tags relation. Use for attach, detach, sync, or querying.
$user->tags; // Collection of Tag models $user->tags()->attach($tagId); // Attach by ID $user->tags()->detach($tagId); // Detach by ID $user->tags()->sync([1, 2, 3]); // Sync tag IDs
tag(string $name): void
Attaches a tag by name. Creates the tag if it doesn't exist.
$user->tag('developer'); $user->tag('admin');
detag(string $name): void
Removes a tag by name. No-op if the tag doesn't exist or isn't attached.
$user->detag('developer');
Tag Model
Tag::name(string $name): Tag
Get or create a tag by name. Creates with description => 'Automatically generated' when new.
$tag = Tag::name('laravel');
$tag->tagged(): BelongsToMany
Returns the relation to models that have this tag.
$tag->tagged; // Collection of tagged models (e.g. Users) $tag->tagged()->get(); // Query builder
Pivot includes created_at.
$tag->category(): BelongsTo
Returns the optional tag category.
$tag->category; // TagCategory or null
TagCategory Model
TagCategory::name(string $name): TagCategory
Get or create a category by name. Creates with description => 'Automatically generated' when new.
$category = TagCategory::name('programming');
$category->tags(): HasMany
Returns tags in this category.
$category->tags; // Collection of Tag models
Example
// Tag a user $user->tag('developer'); $user->tag('admin'); // List tags $user->tags->pluck('name'); // ['developer', 'admin'] // Remove a tag $user->detag('admin'); // Sync tags (replace all) $user->tags()->sync([ Tag::name('moderator')->id, Tag::name('reviewer')->id, ]); // From a tag: get all tagged models $tag = Tag::name('developer'); $tag->tagged; // Users (or your taggable model) with this tag
Testing
composer test
That runs type coverage (100%), unit tests (exactly 100% coverage), Pint + Rector dry-run, and PHPStan.
On GitHub, .github/workflows/run-tests.yml runs the same gate on every push and pull request to main (PHP 8.5).
Dependabot opens weekly PRs for Composer and GitHub Actions; patch and minor updates auto-merge when CI is green.
Changelog
Please see CHANGELOG for more information on what has changed recently.
Contributing
Please see CONTRIBUTING for details.
Security Vulnerabilities
Please review our security policy on how to report security vulnerabilities.
Credits
License
The MIT License (MIT). Please see LICENSE for more information.