Эффективные способы создания уникальных пулов в Laravel с автоматической нумерацией

Метод 1: метод Laravel Str::slug()
Laravel предоставляет удобный вспомогательный метод под названием Str::slug(), который преобразует строку в URL-адресный фрагмент. Однако это не гарантирует уникальности. Мы можем изменить этот метод, чтобы добавить автоматическую нумерацию, если существует повторяющийся фрагмент.

use Illuminate\Support\Str;
function generateUniqueSlug($title)
{
    $slug = Str::slug($title);
    $count = 1;
    while (Model::where('slug', $slug)->exists()) {
        $slug = Str::slug($title) . '-' . $count;
        $count++;
    }
    return $slug;
}

Метод 2: использование правила проверки уникальности Laravel.
Правила проверки Laravel можно использовать для обеспечения уникальных фрагментов. Мы можем объединить правило uniqueсо специальным замыканием, чтобы добавить число к слагу, если оно уже существует.

use Illuminate\Validation\Rule;
function generateUniqueSlug($title)
{
    $slug = Str::slug($title);
    $validator = Validator::make(['slug' => $slug], [
        'slug' => Rule::unique('table_name')->where(function ($query) {
            return $query->where('column_name', $value);
        }),
    ]);
    if ($validator->fails()) {
        $count = 1;
        while (Validator::make(['slug' => $slug], [
            'slug' => Rule::unique('table_name')->where(function ($query) use ($count) {
                return $query->where('column_name', $value . '-' . $count);
            }),
        ])->fails()) {
            $count++;
        }
        $slug = $slug . '-' . $count;
    }
    return $slug;
}

Метод 3: прослушиватели событий Eloquent
Другой подход заключается в использовании прослушивателей событий Eloquent для автоматического создания уникальных фрагментов при каждом создании новой модели. Мы можем использовать событие creatingдля изменения пула перед сохранением его в базе данных.

class Model extends Eloquent
{
    protected static function boot()
    {
        parent::boot();
        static::creating(function ($model) {
            $slug = Str::slug($model->title);
            $count = 1;
            while (static::where('slug', $slug)->exists()) {
                $slug = Str::slug($model->title) . '-' . $count;
                $count++;
            }
            $model->slug = $slug;
        });
    }
}

, уникальное правило проверки или прослушиватели событий Eloquent, вы можете легко создавать уникальные фрагменты и обрабатывать дубликаты, добавляя числа. Выберите метод, который лучше всего соответствует требованиям вашего проекта, и начните создавать удобные URL-адреса уже сегодня!