Automatic HashId generator for your Laravel Eloquent models.
Laravel HashId provides an elegant way to add hashed IDs to your Eloquent models. It generates unique, non-sequential hashes for your model IDs and provides convenient methods to work with them.
Version 3.2.0 introduces powerful column selection capabilities along with full Laravel 11/12 and PHP 8.4 compatibility.
// Get user by hash with specific columns (better performance!)
$user = User::byHash($hash, ['name', 'email']);
// Get user by hash with single column
$user = User::byHash($hash, ['name']);
// Column selection with exception handling
$user = User::byHashOrFail($hash, ['name', 'email']);Benefits:
- π Better Performance - Load only the columns you need
- π Type Safety - Automatic primary key inclusion when required
- π Backward Compatible - All existing code works unchanged
- π― Smart Defaults -
['*']loads all columns, just like before
| Laravel HashId | PHP Version | Laravel 10 | Laravel 11 | Laravel 12 |
|---|---|---|---|---|
| 3.2 π | β₯ 8.1 | β | β | β |
| 4.x π | β₯ 8.1 | β | β | β |
- π Stable Release (3.2) - Recommended for production
- π Development Branch (4.x) - Latest improvements
| Laravel HashId | PHP Version | Laravel 6 | Laravel 7 | Laravel 8 | Laravel 9 | Laravel 10 | Laravel 11 | Laravel 12 |
|---|---|---|---|---|---|---|---|---|
| 1.x | β₯ 7.0 |
β | β | β | β | β | β | β |
| 2.x | β₯ 7.2 |
β | β | β | β | β | β | β |
| 3.0 | β₯ 7.4 |
β | β | β | β | β | β | β |
| 3.1 | β₯ 8.0 |
β | β | β | β | β | β | β |
| 3.2 π | β₯ 8.1 |
β | β | β | β | β | β | β |
| 4.x π | β₯ 8.1 |
β | β | β | β | β | β | β |
π Version Recommendations:
- Laravel 6-9 β Use
3.0or3.1 - Laravel 10+ β Use
3.2(stable) or4.x(development) - Latest features β Use
3.2+with column selection support
composer require veelasky/laravel-hashidWith Laravel's package auto-discovery, the package will be automatically registered.
Simply add the HashableId trait to any Eloquent model you want to use with HashId:
use Illuminate\Database\Eloquent\Model;
use Veelasky\LaravelHashId\Eloquent\HashableId;
class User extends Model
{
use HashableId;
}$user = User::find(1); // Find user by ID
$user->hash; // Get HashId automatically
// Find by HashId
$user = User::byHash($hash);
$user = User::byHashOrFail($hash); // Throws exception if not found
// Convert between ID and HashId
$hashedId = User::idToHash($id);
$originalId = User::hashToId($hash);
// Query scope
User::query()->byHash($hash)->get();// Load only specific columns for better performance
$user = User::byHash($hash, ['name', 'email']);
// Single column selection
$user = User::byHash($hash, ['name']);
// Column selection with exception handling
$user = User::byHashOrFail($hash, ['name', 'email']);class User extends Model
{
use HashableId;
protected $shouldHashPersist = true; // Persist hash to database
protected $hashColumnName = 'hashid'; // Custom column name (optional)
}The trait automatically overwrites route methods to use HashId:
Route::get('/users/{user}', [UserController::class, 'show']);
class UserController
{
public function show(User $user)
{
// $user resolves automatically by HashId
// Example URL: /users/k1jTdv6l
}
}use App\Models\User;
use Veelasky\LaravelHashId\Rules\ExistsByHash;
$request->validate([
'user_id' => ['required', new ExistsByHash(User::class)],
]);// Using the HashId facade
$hashedId = HashId::idToHash($id, User::class);
$originalId = HashId::hashToId($hash, User::class);
// Manual hash ID creation
$hashId = HashId::make('custom-key', 'custom-salt');class User extends Model
{
protected $hashKey = 'shared-hash-key';
}
class Customer extends User { }
$customer = Customer::find(1);
$user = User::find(1);
// Both will have the same hash
echo $customer->hash === $user->hash; // trueYou can configure HashId behavior using environment variables:
HASHID_SALT=your-custom-salt
HASHID_LENGTH=10
HASHID_ALPHABET=abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890Or publish the configuration file:
php artisan vendor:publish --tag=laravel-hashid-configMIT License. Feel free to use this package in your projects!