Laravel 11 Eloquent ORM: funzionalità utili ma poco conosciute
![Laravel 11 Eloquent ORM](https://bloginnovazione.it/wp-content/uploads/2024/12/laravel-11-eloquent-orm.jpg)
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", ]