Поле ulid
Метод ulid применяется в миграциях Laravel для создания колонки, которая будет хранить уникальные идентификаторы в формате ULID. ULID (Universally Unique Lexicographically Sortable Identifier) представляет собой 26-символьную строку, состоящую из 48 бит временной метки и 80 бит случайных данных. В отличие от UUID, ULID генерируется в лексикографическом порядке, что делает его идеальным для использования в качестве первичного ключа, особенно при работе с большими объемами данных.
Метод ulid автоматически создает колонку типа CHAR(26) с кодировкой BINARY для обеспечения оптимальной производительности. При использовании в качестве первичного ключа, Laravel автоматически будет генерировать ULID значения для новых записей, если в модели используется трейт HasUlids.
Метод принимает один обязательный параметр - имя колонки, и дополнительные модификаторы для настройки поведения колонки.
Синтаксис
<?php
Schema::table('table_name', function (Blueprint $table) {
$table->ulid('column_name');
});
?>
Метод возвращает объект ColumnDefinition, что позволяет применять дополнительные модификаторы, такие как nullable, default, unique и другие.
Пример
Давайте создадим миграцию для таблицы posts с колонкой ulid в качестве первичного ключа:
<?php
use IlluminateDatabaseMigrationsMigration;
use IlluminateDatabaseSchemaBlueprint;
use IlluminateSupportFacadesSchema;
return new class extends Migration
{
public function up(): void
{
Schema::create('posts', function (Blueprint $table) {
$table->ulid('id')->primary();
$table->string('title');
$table->text('content');
$table->timestamps();
});
}
public function down(): void
{
Schema::dropIfExists('posts');
}
};
?>
Пример
Создадим модель Post с трейтом HasUlids для автоматической генерации ULID при создании записи:
<?php
namespace AppModels;
use IlluminateDatabaseEloquentModel;
use IlluminateDatabaseEloquentConcernsHasUlids;
class Post extends Model
{
use HasUlids;
protected $fillable = ['title', 'content'];
}
?>
Теперь при создании новой записи ULID будет генерироваться автоматически:
<?php
use AppModelsPost;
$post = Post::create([
'title' => 'My First Post',
'content' => 'This is the content of my first post.'
]);
echo $post->id;
?>
Результат выполнения кода:
"01H8X3Q4R8Y2Z5K7M9N1P3T6W"
Пример
Добавим колонку ulid в существующую таблицу users с ограничением уникальности:
<?php
use IlluminateDatabaseMigrationsMigration;
use IlluminateDatabaseSchemaBlueprint;
use IlluminateSupportFacadesSchema;
return new class extends Migration
{
public function up(): void
{
Schema::table('users', function (Blueprint $table) {
$table->ulid('ulid')->unique()->nullable();
});
}
public function down(): void
{
Schema::table('users', function (Blueprint $table) {
$table->dropColumn('ulid');
});
}
};
?>
После выполнения миграции можно использовать ULID для поиска пользователей:
<?php
use AppModelsUser;
$ulid = '01H8X3Q4R8Y2Z5K7M9N1P3T6W';
$user = User::where('ulid', $ulid)->first();
if ($user) {
echo $user->name;
}
?>