Introduzione ai Modelli di Eloquent

LT
Luca Terribili
Autore

Essi sono collocati nella directory app/Models e, per convenzione, il nome della tabella è al plurale mentre il nome della classe è al singolare. Questa convenzione facilita la leggibilità del codice e riduce il rischio di errori di mapping. Tuttavia, Laravel offre la possibilità di superare questa regola impostando la proprietà $table direttamente all’interno del modello, garantendo così la massima flessibilità nella definizione delle entità.

In questo articolo approfondiremo tutti gli aspetti fondamentali per creare, configurare e utilizzare i modelli con Eloquent, dal generatore di classi Artisan alle tecniche di interrogazione dei dati con Tinker. Scopriremo come gestire l’assegnazione massiva, come costruire tabelle pivot e come sfruttare al meglio i metodi di ricerca e filtraggio offerti da Eloquent.

Che tu sia alle prime armi con Laravel o un sviluppatore esperto, troverai consigli pratici e esempi concreti per ottimizzare il tuo workflow e mantenere il codice pulito, sicuro e facilmente manutenibile.

Cos’è Eloquent e come funziona

Eloquent è il motore di ORM (Object‑Relational Mapping) integrato in Laravel e rappresenta il cuore dell’interazione con il database. Grazie alla sua sintassi fluida, è possibile eseguire operazioni di CRUD (Create, Read, Update, Delete) in modo intuitivo, sfruttando metodi chainable che ricordano i costruttori di query SQL.

Il paradigma ActiveRecord implica che ogni istanza di un modello corrisponda a una riga della tabella, consentendo di accedere ai campi come se fossero proprietà dell’oggetto. Questo elimina la necessità di gestire manualmente i risultati delle query: Eloquent restituisce collezioni di oggetti già popolati, pronte per essere iterate o trasformate.

In più, Eloquent supporta le relazioni tra tabelle (uno‑a‑uno, uno‑a‑molti, molti‑a‑molti), permettendo di navigare tra i dati correlati con pochi semplici metodi. La definizione delle relazioni è centralizzata nei modelli, migliorando l’organizzazione logica del codice e riducendo la complessità delle operazioni di join.

Creazione dei modelli con Artisan

Uno dei punti di forza di Laravel è lo strumento da riga di comando Artisan, che consente di generare rapidamente le classi modello. Con il comando

viene creato un file nella cartella app/Models, pronto per essere personalizzato. Questo approccio riduce il tempo di configurazione iniziale e garantisce che i modelli rispettino le convenzioni di naming di Laravel.

Nel nostro esempio di progetto, i seguenti comandi creano i quattro modelli necessari per gestire l’applicazione di esempio:

Una volta generati, è buona pratica verificare che i file siano presenti in app/Models e aprirli per definire le colonne disponibili, le relazioni e le configurazioni di sicurezza. Personalizzando i modelli subito dopo la creazione, si evitano errori di schema e si mantiene il codice coerente con le funzionalità richieste dall’applicazione.

Gestione dell’assegnazione massiva: $fillable e $guarded

Per impostazione predefinita, Eloquent blocca l’assegnazione massiva, impedendo l’inserimento diretto di un array di dati nel modello. Questo meccanismo di protezione è fondamentale per evitare vulnerabilità legate al Mass Assignment.

La proprietà $fillable funge da whitelist, elencando i campi che possono essere popolati in modo massivo. Per il modello Producer, ad esempio, la definizione è la seguente:

Analogamente, per i modelli CarModel e Car identifichiamo le colonne editabili:

Quando, invece, si desidera consentire l’accesso a tutti i campi, si utilizza la proprietà $guarded impostata a un array vuoto, creando una blacklist vuota. Nel modello DrivingLicense questo approccio semplifica l’inserimento di record senza elencare ogni campo singolarmente:

L’utilizzo consapevole di $fillable e $guarded rafforza la sicurezza dell’applicazione e mantiene il controllo sui dati che possono essere modificati tramite l’assegnazione massiva.

Modelli pivot e la classe CarUser

Le tabelle pivot gestiscono le relazioni molti‑a‑molti e richiedono una classe speciale che estende Illuminate\Database\Eloquent\Relations\Pivot. Questo consente di trattare la tabella pivot come un modello a tutti gli effetti, aggiungendo attributi o metodi personalizzati.

Per creare il modello pivot CarUser, utilizziamo il comando Artisan con il flag -p:

Il risultato è una classe situata in app/Models/CarUser.php che eredita da Pivot anziché da Model. Grazie a questa eredità è possibile definire colonne aggiuntive (ad esempio, assigned_at) e sfruttare le funzionalità di Eloquent per gestire le relazioni tra Car e User.

Una volta generata, è necessario configurare le relazioni nei modelli principali con i metodi belongsToMany, specificando il nome della classe pivot per una maggiore precisione:

Questo approccio rende le operazioni di associazione e dissociazione tra entità molto più leggibili e consente di gestire logiche aggiuntive direttamente nella classe CarUser.

Utilizzo di Eloquent in Tinker per interrogare i dati

Tinker è il REPL (Read‑Eval‑Print Loop) di Laravel, ideale per testare rapidamente le query sui modelli senza dover scrivere codice all’interno di controller o view. Avviando la console con php artisan tinker, è possibile eseguire comandi interattivi e verificare lo stato del database in tempo reale.

Per recuperare tutti i record del modello Producer, basta digitare:

Il risultato è una Collezione di oggetti Producer, ciascuno rappresentante una riga della tabella. Se il database contiene dieci produttori, la collezione conterrà dieci elementi, confermando la corretta configurazione dei modelli.

Oltre a all(), Eloquent offre una serie di metodi di filtraggio, come where, orWhere, whereIn, orderBy e limit. Questi consentono di estrarre sotto‑insiemi di dati con condizioni precise, rendendo la fase di debugging rapida ed efficiente:

L’interfaccia di Tinker rende immediatamente visibili i risultati, permettendo di iterare, trasformare o persino modificare i record direttamente dalla console.

Metodi di ricerca e filtraggio dei record

Una delle operazioni più frequenti in qualsiasi applicazione è la ricerca di record specifici per ID o per criteri complessi. Il metodo find() restituisce l’istanza corrispondente all’identificatore fornito:

Questo è equivalente a:

Nel caso in cui l’ID richiesto non esista, è consigliabile utilizzare findOrFail(), che genera un’eccezione ModelNotFoundException e, in un contesto HTTP, restituisce automaticamente un errore 404:

Per query più articolate, Eloquent supporta combinazioni di where, orWhere, whereIn, whereBetween e operatori di confronto (>, <, >=, <=). È possibile anche concatenare più filtri per ottenere risultati precisi:

Infine, Eloquent permette di definire scope locali all’interno del modello, in modo da riutilizzare filtri comuni in modo leggibile e DRY (Don’t Repeat Yourself). Ad esempio, aggiungendo nel modello Producer:

si potrà poi recuperare tutti i produttori attivi con un semplice:

Queste funzionalità di ricerca e filtraggio rendono Eloquent uno strumento potente e flessibile, ideale per realizzare applicazioni Laravel robuste e performanti.