Introduzione
Architettura MVC?
Laravel si basa sul modello MVC (rispettivamente, Model, View, Controller).Separare logicamente le componenti che formano un software permette lo sviluppo, il test e l'aggiornamento o manutenzione di ogni parte senza compromettere le altre. L'MVC permette, quindi, di seguire alcuni principi fondamentali legati all'ingegneria del software, come quello della modularità (Vedere un programma non come un "blocco unico" ma come una sinergia di singole componenti indipendenti, o moduli, che collaborano per il funzionamento complessivo dell'intero sistema).
Nel caso dell'architettura MVC:
- Model: si occupa dell'accesso ai dati su cui il software si appoggia durante l'esecuzione e l'interazione
- View: fornisce una visualizzazione dei dati del model e permette all'utente di interagire con il sistema attraverso una "vista"
- Controller: gestisce i comandi ricevuti dall'utente e li mette in pratica modificando lo stato della vista e del modello
In questo tutorial, ti mostreremo come creare un modello da zero, attraverso uno strumento di Laravel, chiamato Eloquent.
Eloquent
Eloquent è un ORM(Object-Relational Mapper), ossia una componente che permette di creare un Database Virtuale orientato agli oggetti, accessibile tramite i costrutti del linguaggio di programmazione in uso (nel tuo caso, quindi, tramite le istruzioni di Laravel).
In sostanza, Eloquent ti permetterà di interagire col tuo database non attraverso le istruzioni per accedere alle sue tabelle, ma tramite l'interazione con il Model creato.
Pre-Requisiti
L'unico requisito per seguire questo tutorial è di aver completato, in precedenza, la configurazione di Laravel e l'associazione della tua applicazione web con un database.
Generare il modello e le sue classi
Continueremo a usare lo stesso esempio usato precedentemente, ossia un database contenente informazioni su degli studenti.
Per iniziare con la creazione del modello, spostati nella directory del progetto e utilizza il comando fornito da php artisan :
$ cd testdb
$ php artisan make:model Student
Aggiungendo l'opzione --migrations o -m, verrà creato un file per il modello e un secondo file per definire la modifica del database.
$ php artisan make:model Student --migrations
Ci sono delle classi ausiliari al modello che ti potrebbero servire per determinate operazioni che lo utilizzano. Ti mostriamo qui sotto le loro definizioni:
- Seeder: classe per salvare nel database le modifiche elaborate durante l'esecuzione del software
- Controller: classe usata per organizzare logicamente le richieste in un unico gruppo (es. raggruppare tutte le azioni associate a un profilo utente : creazione, aggiornamento, lettura, cancellazione)
- Factory: classe per creare falsi dati da sfruttare come istanze per le fasi di test dei software
- Policy: classe che organizza, a livello logico, le risorse e le azioni svolgibili dagli utenti nell'interazione con il modello, inserendo appunto delle regole e restrizioni.
Infine, per ispezionare gli attributi e le relazioni del modello, basterà il comando:
$ php artisan model:show Student
Struttura di un modello
I modelli verranno installati nella directory app/Models del tuo progetto. L'interno del file .php seguirà una sintassi simile all'esempio:
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class Student extends Model
{
use HasFactory;
}
Nomi di tabelle
Eloquent segue una convenzione per la corrispondenza tra i nomi dei modelli e della tabella. La regola vuole che un modello, come Student avrà una corrispondenza con un nome di una tabella nel database, indicato in minuscolo e al plurale: students. Nel caso in cui il nome del modello presenti più lettere maiuscole, nella "traduzione" in nome di tabella, esse indicheranno l'inizio di parole separate da caratteri underscore (es: StudentManager = student_managers).
E' possibile, infine, personalizzare la corrispondenza tra il nome di un modello e quello di una tabella, usando la proprietà $table:
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class Student extends Model
{
@var string
protected $table = 'new_students';
use HasFactory;
}
Chiavi Primarie
Eloquent, di default, associa la chiave primaria di una tabella alla denominazione id al suo interno. Nel caso in cui tale campo non sia presente in tabella, puoi specificare un nome associato alla chiave primaria, definendo la proprietà $primaryKey :
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class Student extends Model
{
@var string
protected $table = 'new_students';
protected $primaryKey = 'badge_number';
use HasFactory;
}
Di default, la chiave primaria verrà considerato come un indice, ossia un intero che si incrementa ogni volta che una nuova riga verrà aggiunta alla tabella. Per disattivare questa proprietà, nel caso tu voglia una chiave non incrementale, sarà sufficiente modificare la proprietà booleana $incrementing, settandola su "false". Nel caso in cui tu voglia specificare un altro tipo di dato associato alla chiave, dovrai invece usare la proprietà $keyType:
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class Student extends Model
{ @var bool
@var string
protected $table = 'new_students';
protected $primaryKey = 'badge_number';
public $incrementing = false;
protected $keyType = 'string';
use HasFactory;
}
Connessioni al database
Eloquent userà di default la modalità di connessione configurata nella tua applicazione. Tuttavia, ti è possibile cambiare questa impostazione e specificare la modalità di connessione preferita, specificando un parametro associato alla proprietà $connection:
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class Student extends Model
{ @var bool
@var string
protected $table = 'new_students';
protected $primaryKey = 'badge_number';
public $incrementing = false;
protected $keyType = 'string';
protected $connection = 'sqlite';
use HasFactory;
}
Valori di default
Eloquent non associa valori agli attributi di default. Ciò può però essere definito specificando la proprietà $attributes e inserendo, come valore, una serie di attributi con i loro valori di default associati:
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class Student extends Model
{ @var bool
@var string
@var array
protected $table = 'new_students';
protected $primaryKey = 'badge_number';
public $incrementing = false;
protected $keyType = 'string';
protected $attributes = [
'name' => 'not_available',
];
use HasFactory;
}
Accedere ai dati dei modelli
Ora che hai creato i tuoi modelli, potrai accedervi per recuperare i campi e i valori a essi associati, costruire query o aggiornare i dati.
Selezione
Per cominciare, puoi recuperare le informazioni di un determinato modello tramite la normale funzione echo. Per esempio, per stampare a video tutti gli studenti del database:
use App\Models\Student;
foreach (Student::all() as $student) {
echo $student->name;
}
In questo caso:
- Student::all() : seleziona tutti le righe ed i campi della tabella (come SELECT *) foreach : esegue l'operazione per tutti gli studenti registrati (ossia per tutte le righe della tabella)
Per selezionare solo alcuni campi, alcuni range di valori o ordinare in modo particolare i risultati, potrai costruire delle query secondo la sintassi dell' esempio:
$students = Student::where('surname', 'Rossi')
->orderBy('name')
->take(10)
->get();
In questo caso, avrai commissionato la selezione dei soli studenti che abbiano cognome "Rossi". L'ordine dei risultati sarà in base al nome, in ordine alfabetico, e verranno considerati solo i primi 10 risultati. Il metodo get si limiterà a recuperare questi risultati e salvarli nella variabile $students. Per stampare a video, dovrai ricorrere nuovamente a echo.
Aggiornamento
Potrebbe capitare che i dati nel database vengano aggiornati mentre l'istanza del modello associato alla tabella rimarrebbe alla versione dei dati precedente. I metodi fresh e refresh permettono di creare una nuova versione di quel modello, conservando, se necessario, anche l'istanza precedente. Nell'esempio:
$student = Student::where('badge_number', '002')->first();
$freshStudent = $student->fresh();
Il metodo fresh permetterà di salvare la nuova istanza del modello all'interno di una variabile.
Nel caso del metodo refresh, non ci sarà bisogno di creare una istanza nuova per rappresentare l'aggiornamento poiché il modello esistente verrà aggiornato con i nuovi dati.
$student = Student::where('badge_number', '002')->first();
$student->surname = 'Blasi';
$student->refresh();
$student->surname; // "Blasi"
Cancellazione
Per cancellare un modello infine, puoi utilizzare il metodo delete:
use App\Models\Student;
$student = Student::find(1);
$student->delete();
Per rimuovere tutti i modelli associati a una tabella del database, puoi usare invece truncate:
Student::truncate();
E' possibile usare il metodo destroy per cancellare i modelli associati a delle chiavi primarie, senza doverli recuperare singolarmente. Ad esempio:
Student::destroy(1);
Student::destroy(1, 2, 3);
Student::destroy([1, 2, 3]);
Student::destroy(collect([1, 2, 3]));
Con i primi tre comandi si eliminano gli utenti con id 1, 2 e 3, mentre con l'ultimo restituisce il numero dei record eliminati.
Infine, puoi ovviamente applicare il metodo delete al risultato di una query, cancellando tutti i modelli che ne rispecchiano i criteri:
$deleted = Student::where('surname', 'Blasi')->delete();
Conclusioni
Ben fatto! Al termine di questo tutorial avrai imparato le basi delle operazioni possibili con i modelli di Laravel, grazie all'utilizzo dello strumento Eloquent.
Nella prossima guida di questa serie vedremo come creare i controller per gestire le richieste nella tua applicazione web sviluppata con Laravel.