https://laravel-news.com/laravel-unique?ref=dailydev
https://github.com/willvincent/laravel-unique
Laravel Unique is a package created by Will Vincent that provides a trait for Laravel Eloquent models to ensure a field remains unique within specified constraints. It offers flexible suffix formats or custom value generators, ideal for scenarios like unique names, slugs, or identifiers.
#Main Features
Enforces uniqueness at the application level before saving.
Supports custom suffix formats (e.g., ({n}) or -{n}).
Allows custom value generators for advanced uniqueness logic.
Configurable via a config file or model properties.
Handles constraints (e.g., uniqueness within a specific scope).
#Examples
use WillVincent\LaravelUnique\HasUniqueNames;
class Team extends Model
{
use HasUniqueNames;
// Optional: Override default settings
protected $uniqueField = 'team_name'; // Field to keep unique (default: 'name')
protected $constraintFields = ['team_id']; // Scope of uniqueness (default: [])
protected $uniqueSuffixFormat = '-{n}'; // Suffix format (default: ' ({n})')
}
If our team_name is "LNFC" and our team_id is 1, then our output would be:
Output: "LNFC" (if unique)
Output: "LNFC-1" (if "LNFC" already exists)
Output: "LNFC-2" (if "LNFC" and "LNFC-1" already exists)
You can also create a custom generator by adding a method to your Model:
protected $uniqueValueGenerator = 'generateUniqueTeamName';
public function generateUniqueTeamName(string $base, array $constraints, ?int $attempt): string
{
return $base . '-' . \Str::random(5);
}
Output: "LNFC-L2avJ" (random 5-character suffix)
Install the package via Composer:
composer require willvincent/laravel-unique
If you need to customize the defaults you can publish the configuration file (optional):
php artisan vendor:publish --tag="laravel-unique-config"
Note: This package ensures uniqueness at the application level. For data integrity, particularly in high-concurrency scenarios, it is advisable to add database-level unique constraints (such as unique indexes) in conjunction with this trait.