В Laravel принято отслеживать пользователя, который создал и последним обновил запись в таблице базы данных. Эта информация может быть полезна для целей аудита или для отображения пользовательских данных. В этой статье мы рассмотрим различные методы автоматического заполнения полей «create_by» и «updated_by» в Laravel, гарантируя, что соответствующая информация о пользователе записывается с каждой записью базы данных.
Метод 1: использование событий модели
Один из способов автоматического обновления полей «created_by» и «updated_by» — использование событий модели Laravel. Мы можем определить прослушиватели событий в наших моделях для обработки необходимой логики. Вот пример:
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class YourModel extends Model
{
protected static function boot()
{
parent::boot();
static::creating(function ($model) {
$model->created_by = auth()->id();
});
static::updating(function ($model) {
$model->updated_by = auth()->id();
});
}
}
Метод 2: использование глобальных областей
Другой подход — использовать глобальные области Laravel, которые позволяют нам автоматически применять условия ко всем запросам для данной модели. Мы можем определить пользовательскую область, чтобы добавить в запрос поля «create_by» и «updated_by». Вот пример:
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Scope;
class YourModel extends Model
{
protected static function boot()
{
parent::boot();
static::addGlobalScope(new class implements Scope {
public function apply(Builder $builder, Model $model)
{
$userId = auth()->id();
$builder->addSelect(['created_by' => YourModel::select('created_by')
->whereColumn('your_model.id', '=', 'models.id')
->limit(1)
])->addSelect(['updated_by' => YourModel::select('updated_by')
->whereColumn('your_model.id', '=', 'models.id')
->orderByDesc('updated_at')
->limit(1)
]);
$builder->withGlobalScope('created_by', function (Builder $builder) use ($userId) {
$builder->where('created_by', '=', $userId);
});
$builder->withGlobalScope('updated_by', function (Builder $builder) use ($userId) {
$builder->where('updated_by', '=', $userId);
});
}
});
}
}
Метод 3: использование триггеров базы данных
Если вы предпочитаете обрабатывать эту логику на уровне базы данных, вы можете использовать триггеры базы данных для автоматического обновления полей «created_by» и «updated_by». Этот подход не зависит от Laravel и работает с любой системой баз данных, поддерживающей триггеры. Вот пример использования MySQL:
CREATE TRIGGER tr_your_model_before_insert
BEFORE INSERT ON your_model
FOR EACH ROW
BEGIN
SET NEW.created_by = @user_id;
END;
CREATE TRIGGER tr_your_model_before_update
BEFORE UPDATE ON your_model
FOR EACH ROW
BEGIN
SET NEW.updated_by = @user_id;
END;
В этой статье мы рассмотрели три различных метода автоматического заполнения полей «create_by» и «updated_by» в Laravel. Используя события модели, глобальные области видимости или триггеры базы данных, мы можем гарантировать, что соответствующая информация о пользователе записывается с каждой записью базы данных. Выберите метод, который лучше всего соответствует требованиям вашего проекта, и реализуйте его соответствующим образом.