Laravel: aggiornare in automatico i campi created_by e updated_by

Laravel gestisce autonomamente i campi created_at e updated_at, popolandoli in fase di creazione o modifica di un record.
Non c'è però una gestione integrata per quanto riguarda i campi created_by e updated_by, che permetterebbero di salvare oltre ai timestamps anche le informazioni riguardanti gli utenti che hanno interagito con il modello.

Per non ripetere codice inutile è possibile creare un Trait da applicare ai modelli interessati.

Come prima cosa all'interno della migrazione creiamo i due campi necessari:

Schema::create('products', function (Blueprint $table) {
    $table->id();
    $table->timestamps();

    $table->unsignedBigInteger('created_by')->nullable();
    $table->unsignedBigInteger('updated_by')->nullable();

    $table->string('title');
});

In app/Models/Traits creiamo un nuovo file HasUserinfo.php, con questo contenuto:

<?php

namespace App\Models\Traits;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Facades\Auth;

trait HasUserinfo
{
    public static function boot()
    {
        parent::boot();

        static::creating(function ($model) {
            $user = Auth::user();
            if ($user) {
                $model->created_by = $user->id;
                $model->updated_by = $user->id;
            }
        });

        static::updating(function ($model) {
            $user = Auth::user();
            if ($user) {
                $model->updated_by = $user->id;
            }
        });
    }
}

A questo punto è possibile aggiungere il Trait a tutti i modelli per cui vogliamo salvare le informazioni sugli utenti che creano o modifcano un record.

Ad esempio per il model Product scriveremo quanto segue:

<?php

namespace App\Models;

use App\Models\Traits\HasUserinfo;
use Illuminate\Database\Eloquent\Model;

class Product extends Model
{
    use HasUserinfo;

    //.........

Con queste poche righe di codice php Eloquent gestirà in autonomia questi due campi salvando delle informazioni utili per gli utenti.

 


Commenti