Laravel 11 Eloquent ORM

Laravel è un framework MVC ricco di funzionalità e in continua evoluzione

L’ORM Eloquent, in Laravel, fornisce un’implementazione semplice ed efficiente di ActiveRecord per lavorare con il tuo database.

In questo articolo vediamo alcune funzionalità poco conosciute, e molto utili.

3 minuti

Vediamo in questo articolo come Laravel 11 Eloquent ORM ci può aiutare per risolvere problemi specifici.

Colonna deleted_at per le soft deletes

Laravel gestisce le eliminazioni soft tramite la colonna deleted_at. Questo vuol dire che abbiamo a disposizione una proprietà che ci consente di impostare la validità del soft delete. Possiamo quindi cambiare l’impostazione definendo esplicitamente la proprietà DELETED_AT all’interno della classe che definisce il Model:

class House extends Model
{
    use SoftDeletes;

     * The name of the "deleted at" column.
     *
     * @var string
     */
    const DELETED_AT = 'is_deleted';
}

Oppure definendo un metodo sempre all’interno della classe in cui vogliamo gestire il soft delete:

class House extends Model
{
    use SoftDeletes;

    public function getDeletedAtColumn()
    {
        return 'is_deleted';
    }
}

Come gestire le soft deletes

Per gestire le soft deletes abbiamo a disposizione alcuni metodi, tra cui:

  • withTrashed(): per includere temporaneamente i record eliminati, in modo soft;
  • onlyTrashed(): includere temporaneamente solo i record eliminati, in modo temporaneo;
  • restore(): ripristinare i record eliminati;

Questo gruppo di metodi viene utilizzato per gestire la funzionalità Soft Deletes in Laravel.
Ho scritto un articolo molto elaborato su tutto ciò che riguarda Soft Deletes

$houses = House::withTrashed()->get();
$trashedHouses = House::onlyTrashed()->get();
House::withTrashed()->where('id', 1)->restore();

Clonare un Model

Puoi clonare un modello usando replicate(). Il risultato sarà una copia del modello in una nuova istanza inesistente. Nel seguente esempio viene eseguito il metodo replicate() sul modello $house, generando un nuovo modello $newHouse che con il save genererà un record nuovo e uguale a quello estratto mediante find().

$house = App\House::find(1);
$newHouse = $house->replicate();
$newHouse->save();

Salvare modelli e relazioni

È possibile salvare un modello e le relazioni corrispondenti utilizzando il metodo push(). Nell’esempio successivo creiamo un nuovo modello di tipo House, con nome Villa Cleopatra e indirizzo del cantiere Mulberry Street: invocando il metodo push() sul Model House andiamo a salvare sia il Model House che il Model WorkSite.

class House extends Model
{
    public function worksite()
    {
        return $this->hasOne('App\WorkSite');
    }
}
$house = House::first();
$house->name = "Villa Cleopatra";
$house->worksite->address = 'Mulberry Street';
$house->push(); // This will update both house and worksite record in DB

Come ottenere gli attributi originali

Se dopo aver modificato un record Eloquent, se vuoi rileggere i valori originali: puoi farlo. Per farlo puoi richiamare la funzione getOriginal()

$house = App\House::first(); 
$house->name; //Villa Cleopatra
$house->name = "Villa Giulio Cesare"; // Villa Giulio Cesare
$house->getOriginal('nome') ; //Villa Cleopatra
$house->getOriginal() ; //Original $house record

Come controllare se il modello è cambiato

Per determinare se un modello o un attributi specifico, sono stati modificati, puoi usare la funzione isDirty()

$house = App\House::first();
$house->isDirty();          //false
$house->name = "Villa Giulio Cesare";
$house->isDirty();          //true

Puoi anche controllare se un particolare attributo è stato modificato.

$house->isDirty('name');    //true
$house->isDirty('address');     //false

Come ottenere gli attributi modificati

Se individuiamo che un modello è stato modificato, e vogliamo sapere nel dettaglio cosa è stato modificato, allora possiamo farlo con la funzione getChanges(). La funzione restituisce una array con l’elenco degli attributi coinvolti nella modifica.

$user->getChanges()      // [  "name" => "Peter",  ]

Autore