composer require labrodev/numberable in your Laravel project.ModelHasNumber trait to any Eloquent model:
use Labrodev\Numberable\ModelHasNumber;
class Invoice extends Model
{
use ModelHasNumber;
}
202400001 for the first record in 2024).ModelHasNumber in src/ModelHasNumber.php for default behavior.generateNumberByTraitModelHasNumber() in your model for custom logic.tests/ directory for usage patterns.creating event to generate a number before saving.{year}{zero-padded-ID} (e.g., 202400001).generateNumberByTraitModelHasNumber() for bespoke formats (e.g., alphanumeric, sequential letters).number column (e.g., string or integer) to store the generated value.number field matches expected formats:
protected $rules = [
'number' => 'required|string|size:10', // Adjust size as needed
];
public function scopeByNumber($query, $number)
{
return $query->where('number', $like, "%{$number}%");
}
INV-2024-001), extend the trait or use a custom generator:
protected function generateNumberByTraitModelHasNumber(int $modelId): string
{
return "INV-" . now()->format('Y') . "-{$this->padZero($modelId, 3)}";
}
shouldGenerateNumber():
protected function shouldGenerateNumber(): bool
{
return !app()->runningUnitTests(); // Example condition
}
deleted_at check in generateNumberByTraitModelHasNumber().sequence_number).shouldGenerateNumber() guard to skip deleted models.protected function getCurrentYear(): string
{
return Carbon::now()->format('Y') === '2024' ? '2025' : Carbon::now()->format('Y');
}
generateNumberByTraitModelHasNumber() during bulk operations (e.g., migrations).number column exists and is nullable if needed.creating event listeners interfere with numbering.ABC-2024-001).DOC-{year}-{id}).protected int $predictionNumber = 10000; // Default
DD/MM/YYYY-ID for non-English regions).generateNumberByTraitModelHasNumber() in unit tests:
$model->shouldReceive('generateNumberByTraitModelHasNumber')->andReturn('TEST123');
number column with a default value (e.g., NULL) to avoid breaking existing records:
Schema::table('invoices', function (Blueprint $table) {
$table->string('number')->nullable()->after('id');
});
/**
* Custom number generation logic.
* Format: INV-{year}-{3-digit-sequence}
*/
protected function generateNumberByTraitModelHasNumber(int $modelId): string
How can I help you explore Laravel packages today?