Автоматическая реализация полей «create_by» и «updated_by» в Laravel: подробное руководство

В 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. Используя события модели, глобальные области видимости или триггеры базы данных, мы можем гарантировать, что соответствующая информация о пользователе записывается с каждой записью базы данных. Выберите метод, который лучше всего соответствует требованиям вашего проекта, и реализуйте его соответствующим образом.