14 Models per migrazioni

I modelli sono una rappresentazione di una tabella attraverso una classe.

Su app/Models troviamo il model predefinito User.php

class User extends Authenticatable {

Analisi classe User

Laravel suppone che la tabella abbia lo stesso nome della classe, tutto minuscolo e in plurale ( users ). Se così non fosse possiamo aggiungere una proprietà $table protected specificando il nome della tabella

class User extends Authenticatable {
$protected $table = 'galleryusers';

Se guardate la nostra classe User estende Authenticatable, questo perchè l’utente dovrà fare il login, la verifica e il recupero della password…

class User extends Authenticatable
{
 use HasFactory, Notifiable;

Di default vengono usati i traits HasFactory e Notifiable, il primo per legare una factory al model e come devono essere creati i dati da inserire nella tabella users, mentre il secondo si occupa delle notifiche delle rotte.

Grazie a HasFactory, se la classe User ha un metodo newFactory() che restituisce un risultato, ok, altrimenti viene chiamato factoryForModel() che andrà a cercarsy una factory chiamata UserFactory nella cartella database/factories.

Sempre nella classe User troviamo poi una proprietà protetta $fillable che contiene i campi della tabella da riempire

protected $fillable = [
'name',
'email',
'password',
];

Gli altri campi come emain_verify_at, created_at, update_at vengono compilati automaticamete da laravel, quindi non serve specificarli qui, ma tramite la proprietà $casts che ne converte il formato in datetime.

protected $casts = [
'email_verified_at' => 'datetime',
];

Se vogliamo aggiungere dei campi basta inserirli in questo array.

L’altra proprietà protetta $hidden viene usato da laravel quando deve serializzare un oggetto di tipo user, questi valori non vengono restituiti

protected $hidden = [
 'password',
 'remember_token',
];

ORM eloquent

Laravel utilizza un Object Relational Mapper chiamato eloquent che utilizza un pattern Active Record ovvero la classe User mappa una tabella e quando abbiamo un record di questa tabella, tale record è attivo, ovvero lo possiamo modificare, cancellare, inserire.

Uno sguardo a UserFactory

Sotto database/factories, come già visto abbiamo troviamo la factory UserFactory.

La factory è una classe che utilizza un pattern che permette la creazione nella stessa istanza di un oggetto.

Possiamo creare una factory personalizzata anche tramite CLI, la factory deve avere il nome del model con l’iniziale maiuscola seguito dalla keyword Factory ed estendere la classe Factory

class UserFactory extends Factory {

Troviamo poi il nome del model in una proprietà $model

protected $model = User::class;

nel metodo defination() verranno restituiti i campi da popolare nella nostra tabella

public function definition()
{
 return [
  'name' => $this->faker->name,
  'email' => $this->faker->unique()->safeEmail,
  'email_verified_at' => now(),
  'password' => '$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', // password
  'remember_token' => Str::random(10),
 ];
}

faker è un pacchetto aggiuntivo presente nelle ultime versioni di laravel che permette di popolare i campi della tabella con dati fittizi. Se controlliamo la documentazione di faker troviamo tantissimi esempi per popolare tantissimi tipi di campi diversi a seconda di ogni esigenza.

Inseriamo i dati tramite la factory

Ritorniamo al nostro seed UserSeeder rimuovendo gli esempi precedenti nel metodo run() e all’interno richiamiamo la nostra factory

public function run()
{

}

Lanciamo un migrate:fresh per pulire la tabella

php artisan migrate:fresh

a questo punto all’interno del metodo run() richiamiamo la nostra factory specificando 30 records ed eseguendo il metodo create()

public function run()
{
 \App\Models\User::factory(30)->create();
}

lanciamo il seed e troveremo 30 righe di dati compilati correttamente

php artisan db:seed

Possiamo anche cambiare il tipo di dati con quelli in italiano, cambiando il valore della chiave faker_locale con it_IT in config/app.php

'faker_locale' => 'en_US',

lanciando di nuovo il seed verranno aggiunti altri 30 campi in italiano.

Per tutte le numerevoli funzionalità messe a disposizione dalle factories, consultare la documentazione ufficiale di laravel cercando la voce factory.

Prima di procedere alla creazione di una factory personalizzata, vediamo come mostrare i dati nella nostra app. Per farlo impostiamo una rotta su routes/web, avevamo una rotta /users dove con un ciclo restituivamo numerati i nomi di un array, cancelliamo tutto e utilizziamo il model User e importiamolo (spostiamo la rotta più in alto delle altre per evitare conflitti di precedenze dagli esercizi fatti nelle prime lezioni ).

use App\Models\User;

Route::get('/users', function () {
 return User::get();
});

Se apriamo l’url /users verranno restituiti i dati, possiamo usare invece che User::get(),

User::paginate(5) che ci restituisce solo 5 record e i link per passare alle pagine successive.

Tutte queste utili funzioni e molte altre sono disponibili grazie all’utilizzo dei models e la stessa classe User è un’estensione di Authenticatable che a sua volta deriva dalla classe Model.