13 database seeders
In questo articolo vedremo come alimentare con dati le tabelle per poter poi effettuare query e operazioni. Per fare questo utilizzeremo i seeders ovvero dei files che ci permetteranno di aggiungere records. In inglese seeder vuol dire seminare, nel nostro caso lo possiamo tradurre come popolare i campi delle tabelle.
In fase iniziale laravel ha incluso un seeder di default, lo possiamo trovare in database/seeders con il nome di DatabaseSeeder.php ecco il contenuto
namespace Database\Seeders; use Illuminate\Database\Seeder; class DatabaseSeeder extends Seeder { public function run() { // \App\Models\User::factory(10)->create(); } }
Vediamo come creare un nuovo seeder con il comando make::seeder
php artisan make:seeder UserSeeder
Per convenzione il nome del seeder si mette con il nome della tabella che andremo a popolare con l’iniziale maiuscola e al singolare seguita dalla parola Seeder ( UserSeeder ). Ecco li contenuto del nuovo file creato
use Illuminate\Database\Seeder; class UserSeeder extends Seeder { public function run() { } }
Viene creata la classe UserSeeder che estende ed eredita la classe Seeder. Abbiamo il metodo run() che ciene lanciato quando eseguiremo il seeder o tutti i seeders.
php artisan db:seed
Con il comando db:seed lancieremo tutti i seeders
php artisan db:seed --class UserSeeder
specificando –class lanceremo solo il seed UserSeeder ed eseguirà il contenuto inserito nel suo metodo run().
Inserire i dati manualmente in una tabella
Nella tabella users creata precedentemente, troviamo i campi: id, name, email, email_verified_at, password, remember_token, created_atcreated_at, updated_at .
Laravel mette a disposizione una classe Db per accedere al database. Questa classe può essere richiamata mediante il suo alias.
Gli alias sono dei nomi che permettono di richiamare una classe senza specificare tutto il percorso per esteso e senza doverla importare con use. Questo è possibile grazie al file config/app.php che viene inizializzato all’avvio. All’interno del file troviamo la sezione aliases dove vengono specificati i nomi degli alias che richiameranno la rispettiva classe tramite un autoload precaricato
'aliases' => [ 'App' => Illuminate\Support\Facades\App::class, 'Arr' => Illuminate\Support\Arr::class, 'Artisan' => Illuminate\Support\Facades\Artisan::class, 'Auth' => Illuminate\Support\Facades\Auth::class, 'Blade' => Illuminate\Support\Facades\Blade::class, 'Broadcast' => Illuminate\Support\Facades\Broadcast::class, 'Bus' => Illuminate\Support\Facades\Bus::class, 'Cache' => Illuminate\Support\Facades\Cache::class, 'Config' => Illuminate\Support\Facades\Config::class, 'Cookie' => Illuminate\Support\Facades\Cookie::class, 'Crypt' => Illuminate\Support\Facades\Crypt::class, 'DB' => Illuminate\Support\Facades\DB::class, .......
Quindi se noi scriveremo App richiameremo la facade Illuminate\Support\Facades\App. Questo ci permette di scrivere agevolmente solo app senza importare la classe e specificare tutto il percorso.
Andiamo ad inserire in run() la classe Db utilizzando il suo metodo Db::insert()
DB::insert('insert into user ( name, email, password, created_at, email_verified_at ) values (?, ?, ?, ?, ?)');
mettiamo tutti il comando SQL in una variabile per agevolare il codice
$sql = 'insert into user ( name, email, password, created_at, email_verified_at ) values (?, ?, ?, ?, ?)'; DB::insert($sql);
Nei campi values metto tanti segnaposti, simboleggiati con il punto interrogativo ( ? ) quanti sono i campi da completare nella tabella user.
Adesso inseriamo i valori nel DB::insert() seguendo l’ordine dei valori inseriti sopra
DB::insert($sql, ['Pippo','pippo@pluto.net',Hash::make('pippopluto'), \Carbon\Carbon::now(), \Carbon\Carbon::now(), ]);
Da fare qualche considerazione è la classe Hash che con il suo comando make ci permette di criptare la password.
Anche la classe Carbon::now() ci resituisce la data attuale.
Importiamo la classe DB e Hash
use DB; use Hash;
Siamo pronti a lanciare il seed che ci inserirà i records specificati nei relativi campi della nostra tabella
php artisan db:seed --class=UserSeeder
Ora che abbiamo visto come inserire i dati nel database, effettuiamo un ciclo for per generare un buon numero di dati, cerchiamo però di crearli casuali in modo da avere un po’ di varietà.
Fa al caso nostro la classe Str di laravel, per la manipolazione delle stringhe, importiamo la classe
use illuminate\Support\Str;
Str ha un metodo random() che accetta come primo parametro la lunghezza
$name = Str::random(10);
per la mail prendiamo la variabile $name e aggiungiamo il suffisso gmail.com.
Mettiamo tutto in un ciclo for per creare 30 utenti
public function run() { for($i=0; $i<30; $i++) { $sql = 'insert into users ( name, email, password, created_at, email_verified_at ) values (?, ?, ?, ?, ?)'; $name = Str::random(10); DB::insert($sql, [ $name, $name . '@gmail.com', Hash::make('pippopluto'), \Carbon\Carbon::now(), \Carbon\Carbon::now(), ]); } }
Ora lanciamo il comando generico per lanciare tutti i seeders, anche se nel nostro caso è solo uno, mettiamo nel seeder principale la chiamata alla classe UserSeeder con il metodo call()
public function run() { $this->call(UserSeeder::class); }
Controlliamo che la casse venga importata automaticamente dal nostro IDE, altrimenti aggiungiamola noi manualmente
use Database\Seeders\UserSeder;
ora possiamo lanciare il comando generico per popolare il nostro database
php artisan db:seed
Metodo table
Un altro modo per inserire dati nel database è quello di utilizzare il metodo table() della classe DB
DB::table('users')->insert([ ]);
Il metodo table() riceve come parametro il nome della tabella e a sua volta ha un metodo insert() che riceve un array di tipo chiave valore, dove la chiave è il nome del campo e il valore i records
DB::table('users')->insert([ 'name' => $name, 'email' => $name . '@gmail.com', 'password' => Hash::make('pippopluto'), 'created_at' => \Carbon\Carbon::now(), 'email_verified_at' => \Carbon\Carbon::now() ]);