When working with invoices, you need to deal with serial numbers that look like ABC-000001
. Do you know how to auto-generate them in Laravel? This tutorial will cover a few ways to do this.
DB Structure
For our example, we will use a simple invoice DB table with the following columns:
-
id
-
user_id
-
due_date
-
amount
-
serial
- Full serial number likeABC-1
-
serial_number
- Serial number like1
-
serial_series
- Serial series likeABC
Here's how that looks in our migration:
Migration
Schema::create('invoices', function (Blueprint $table) { $table->id(); $table->foreignIdFor(User::class)->constrained(); $table->date('due_date'); $table->integer('amount'); $table->string('serial')->nullable(); $table->string('serial_series'); $table->integer('serial_number')->nullable(); $table->timestamps();});
This makes our Model look like this:
app/Models/Invoice.php
use Illuminate\Database\Eloquent\Casts\Attribute;use Illuminate\Database\Eloquent\Factories\HasFactory;use Illuminate\Database\Eloquent\Model;use Illuminate\Database\Eloquent\Relations\BelongsTo; class Invoice extends Model{ use HasFactory; protected $fillable = [ 'user_id', 'due_date', 'amount', 'serial', 'serial_number', 'serial_series', ]; protected function amount(): Attribute { return Attribute::make( get: fn($value) => $value / 100, set: fn($value) => $value * 100, ); } public function user(): BelongsTo { return $this->belongsTo(User::class); }}
Create Invoice: Form
Let's create the Controller methods to save a new invoice and auto-generate the serial number.
This is the form, with series options coming from the config.
app/Http/Controllers/InvoiceController.php
use App\Http\Requests\StoreInvoiceRequest;use App\Models\Invoice;use App\Models\User; class InvoiceController extends Controller{ public function create() { $users = User::pluck('name', 'id'); $invoiceSeries = config('invoiceSettings.availableInvoiceSeries'); return view('invoices.create', [ 'users' => $users, 'invoiceSeries' => $invoiceSeries, ]); }}
These are the config values:
config/invoiceSettings.php
return [ 'availableInvoiceSeries' => [ 'ABC', 'DAF', 'GHI', 'UKS' ],];
And here's the form in...