Blog Detail

11

May
Generate YouTube-like IDs for Models with Laravel Hashids cover image

arrow_back Generate YouTube-like IDs for Models with Laravel Hashids

Laravel Hashids is a small package to generate YouTube-like IDs from numbers. It converts numbers like 347 into strings like yr8.

Installation

You can install this package via composer:

composer require bvtterfly/laravel-hashids

You can publish the config file with:

php artisan vendor:publish --tag="hashids-config"

Usage

Your Eloquent models should have the Bvtterfly\LaravelHashids\HasHashId trait that contains an abstract getHashIdOptions method that you must implement yourself, and it should return the Bvtterfly\LaravelHashids\HashIdOptions class.

Your models’ migrations should have a field to save the generated hashid to.

Here’s an example of what a model would look like:

namespace App\Models;

use Bvtterfly\LaravelHashids\HasHashId;
use Bvtterfly\LaravelHashids\HashIdOptions;
use Illuminate\Database\Eloquent\Model;

class Post extends Model
{
    use HasHashId;

    public function getHashIdOptions(): HashIdOptions
    {
        return HashIdOptions::create()->saveHashIdTo('hashid');
    }

}

By default, the Package will generate hashids from the models’ id.

And Its migration:

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

return new class extends Migration
{
    public function up()
    {
        Schema::create('posts', function (Blueprint $table) {
            $table->increments('id');
            $table->string('hashid')->nullable(); // Field name same as your `saveHashIdTo`
            //...
            $table->timestamps();
        });
    }
}

The hashid column is generated from the id field, But id is an auto-increment column and doesn’t have value before saving in the DB. So, The hashid column must be nullable. And The Package will generate hashid and update the model after being saved in the database.

Generate from Hex numbers

If you want to generate hashids from hex numbers like Mongo’s ObjectIds, you can change the type to the hex:

public function getHashIdOptions(): HashIdOptions
{
    return HashIdOptions::create()
        ->saveHashIdTo('hashid')
        ->setType('hex') // default = int
    ;
}

Generate from another field

public function getHashIdOptions(): HashIdOptions
{
    return HashIdOptions::create()
        ->saveHashIdTo('hashid')
        ->generateHashIdFrom('custom_key')

    ;
}

Generate from the field with value

By default, This package will generate hashids and update the model from the auto-incremented id column after being saved in the database. Still, if your field has value, you can change it to generate hashids while saving:

public function getHashIdOptions(): HashIdOptions
{
    return HashIdOptions::create()
        ->saveHashIdTo('hashid')
        ->setAutoGeneratedField(false)
    ;
}

Using Hashids in routes

To use the hashids in routes, you may specify the hashid column in the route parameter definition:

use App\Models\Post;
 
Route::get('/posts/{post:hashid}', function (Post $post) {
    return $post;
});

or If you would like model binding to always use the hashid column other than id when retrieving a given model class, you may override the getRouteKeyName method on the Eloquent model:

/**
 * Get the route key for the model.
 *
 * @return string
 */
public function getRouteKeyName()
{
    return 'hashid';
}

This package has a lot more, If you want to learn more about it you can visit its complete documentation and source code on Github

Published at : 11-05-2022

Author : Rizwan Aslam
AUTHOR
Rizwan Aslam

I am a highly results-driven professional with 12+ years of collective experience in the grounds of web application development especially in laravel, native android application development in java, and desktop application development in the dot net framework. Now managing a team of expert developers at Codebrisk.

Launch your project

Launch project