Salta al contenuto principale

Introduzione ai Modelli di Eloquent

Profile picture for user luca77king

Eloquent è l'ORM (object-relational mapper) integrato di Laravel. Offre un modo semplice per lavorare con il database, senza dover scrivere query SQL, fornendo all’utente un'implementazione ActiveRecord per lavorare con i suoi dati, il che significa che ogni tabella del database ha un "modello" corrispondente.

I modelli sono archiviati nella directory app/Models e di default seguono la seguente convenzione: il nome della tabella deve essere al plurale e il relativo modello al singolare. È possibile bypassare questo vincolo, specificando nella proprietà $table del modello, il nome della relativa tabella.

Per creare un modello, come al solito possiamo utilizzare Artisan. Creiamo i modelli che ci servono per gestire il database che abbiamo strutturato nelle lezioni precedenti.

php artisan make:model Producer
php artisan make:model CarModel
php artisan make:model Car
php artisan make:model DrivingLicense

Questi quattro comandi creeranno altrettante classi nella directory app/Models.

Di default, i modelli di Laravel non possono valorizzare i records con l'assegnazione massiva, ossia non è possibile inviare un array al modello per creare direttamente un nuovo record nel DB. Questo limite è facilmente aggirabile valorizzando la proprietà fillable del modello. Apriamo quindi il modello Producer e impostiamo la suddetta proprietà.

namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class Producer extends Model
{
    use HasFactory;
    protected $fillable = [
    'name'
    ];
}

Facciamo la stessa operazione per il modello CarModel, ovviamente valorizzando la proprietà con i campi della relativa tabella

namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class CarModel extends Model
{
    use HasFactory;
    protected $fillable = [
    'producer_id',
    'name',
    'price'
    ];
}

E questo è lo snippet per il modello Car

namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class Car extends Model
{
    use HasFactory;
    protected $fillable = [
    'car_model_id',
    'license_plate',
    'registered_at'
    ];
}

Per il modello DrivingLicense invece procederemo in un’altra maniera. Abbiamo a disposizione un’altra proprietà, $guarded, che possiamo valorizzare con un’array vuota. Infatti, mentre la proprietà fillable fornisce al software una whitelist con i campi che si possono valorizzare, la proprietà guarded viene usata per riempire una blacklist. Quindi, valorizzandola con una matrice senza elementi, stiamo dicendo a Laravel che tutti i campi della tabella possono essere valorizzati.

namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class DrivingLicense extends Model
{
    use HasFactory;
    protected $guarded = [];
}

Adesso dobbiamo creare il Modello per la tabella car_user, ma questa tabella è una pivot quindi ha bisogno di una gestione diversa. Per accedere correttamente ai suoi dati dobbiamo creare una classe che non estende Illuminate\Database\Eloquent\Model ma bensì Illuminate\Database\Eloquent\Relations\Pivot.

Possiamo tranquillamente usare Artisan per generare questa classe, basterà aggiungere il parametro –p (pivot)

php artisan make:model CarUser –p

Ora vediamo Eloquent all’opera. Dal momento che disponiamo già di qualche dato nel database, proviamo ad utilizzare i modelli per estrarre e visualizzare i records, avvalendosi di Tinker.

Digitiamo questo comando nella console del progetto

php artisan tinker

Una volta avviato il REPL, utilizziamo questa sintassi per estrarre tutti i records del modello Producer.

\App\Models\Producer::all();

Quello che vediamo nell’immagine è una Collezione di Eloquent che contiene 10 elementi, 10 istanze del modello Producer. Io ho tagliato l’immagine per ragioni editoriali, ma vi assicuro che l’output è corretto, in quanto nel database abbiamo 10 records.

Se avessi voluto filtrare il dato, avrei dovuto usare uno dei tanti helper di Eloquent per invocare le clausole del DBMS. Vediamo alcuni esempi:

// Restituisce i records con id 1,2 e 3
Producer::whereIn('id', [1,2,3])->get();
// Restituisce i records con id 8, 9 e 10
Producer::where('id', '>', 7)->get();
// Restituisce i records con id 8 e 9
Producer::where('id', '>', 7)->where('id', '!=', 10)->get();
// Restituisce i records con id 1, 9 e 10
Producer::where('id', '>', 8)->orWhere('id', '<', 2)->get();

Per recuperare un singolo record, avendo a disposizione il relativo id, possiamo utilizzare il metodo find()

Producer::find(1);

La dichiarazione che abbiamo usato è l’equivalente di questa sintassi

Producer::where('id', '=', $id)->first();

Abbiamo a disposizione anche il metodo findOrFail() il quale restituisce un errore 404, se non trova nella tabella l’id passato come parametro. Ovviamente solo se lo script è eseguito dal web server, mentre su Tinker vedremo solo l’eccezione e non la relativa gestione.

Producer::findOrFail(1233);

Bene, in questo capitolo abbiamo visto i concetti base di Eloquent. Nella prossima lezione vedremo come utilizzare i modelli per inserire nuovi records nel database e come modificarli. In seguito passeremo alle caratteristiche più avanzate di Eloquent, come le relazioni. Nel frattempo, se avete domande su questo articolo o su Laravel in generale, lasciate pure un commento qui sotto e vi risponderò al più presto.