In questo articolo su Laravel popoleremo le tabelle di dati di test con il celebre plugin Faker: creeremo dapprima due tabelle database con una relazione 1 a molti con le migrazioni di Laravel, creeremo il model che le rappresenta, il Controller che le gestisce e le .
Sommario
Creazione delle migrazioni
Creiamo le migrazioni due migrazioni per queste tabelle collegate da una relazione 1 a molti:
Utilizziamo il comando make:model
che ci consente di fare tutto in un colpo: creare la tabella, il model, il controller, e le factory per poter poplare con dati di test le tabelle.
Convenzione: creiamo il modello con il nome al singolare. Eloquent creerà la tabella con il nome al plurale, il Controller con il nome del model, le factories con il nome del model.
Laravel gestisce correttamente anche il fatto che Company è un plurale irregolare nella lingua inglese 🙂
$ php artisan make:model Company -mfscr Model created successfully. Factory created successfully. Created Migration: 2021_11_24_182740_create_companies_table Seeder created successfully. Controller created successfully.
Questo comando crea:
- un model (m) vuoto di nome Company;
- una factory (f) vuota di nome CompanyFactory che ci servirà per definire i tipi di dati di test associare ai record della tabella;
- una migrazione con la creazionedella tabella companies;
- un seeder (s) per riempire di dati la tabella
- un controller (c) di nome CompanyController
- un resource (r) che popola il Controller con metodi standard CRUD (index(), create(), show(), edit(), update() e destroy())
Personalizzazione della migrazione
Dobbiamo definire come sarà la tabella:
class CreateCompaniesTable extends Migration { /** * Run the migrations. * * @return void */ public function up() { Schema::create('companies', function (Blueprint $table) { $table->id(); $table->string('name'); $table->string('website'); $table->string('email')->unique(); $table->float('latitude'); $table->float('longitude'); $table->timestamps(); }); } /** * Reverse the migrations. * * @return void */ public function down() { Schema::dropIfExists('companies'); } }
Facciamo lo stesso per CompanyType:
$ php artisan make:model CompanyType -mfscr Model created successfully. Factory created successfully. Created Migration: 2021_11_24_183431_create_company_types_table Seeder created successfully. Controller created successfully.
Sono stati creati i model, i controller con i 4 metodi standard, i factory.
Lancio della migrazione
Successivamente lanciamo le migrazioni:
$ php artisan migrate Migrating: 2021_11_24_184611_create_company_types_table Migrated: 2021_11_24_184611_create_company_types_table (136.22ms) Migrating: 2021_11_24_184622_create_companies_table Migrated: 2021_11_24_184622_create_companies_table (468.33ms)
Sono state create le tabelle e le relazioni:
Popolamento con dati di test con Faker
Per ultimo lanciamo il seeder che popola di dati la tabella Company Types. Lo facciamo rispettando la prirità che per rispettare la relazione di chiave esterna ci porta a popolare prima la tabella madre (company_types) e poi la figlia (companies).
Occorre dapprima scrivere cosa vogliamo che faccia il Seeder.
Per CompanyType definiamo innazitutto la factory (che definisce come devono essere popolati i campi)
<?php // <APP>/database/factories/CompanyTypeFactory.php namespace Database\Factories; use Illuminate\Database\Eloquent\Factories\Factory; class CompanyTypeFactory extends Factory { /** * Define the model's default state. * * @return array */ public function definition() { return [ 'name' => $this->faker->name(), ]; } }
In questo caso abbiamo unsolo campo per cui utilizziamo un metodo “name” che genererà un nome proprio di persona. Non è questo il caso, ma Faker da la possibilità di generare anche indirizzi random, numeri di telefono, url, email latitudini e longitudini e molto altro ancora.
E poi scriviamo il seeder (definiamo quanti record devono essere creati, in questo caso 3):
<?php // <APP>/database/seeders/CompanyTypeSeeder.php namespace Database\Seeders; use App\Models\CompanyType; use Illuminate\Database\Seeder; class CompanyTypeSeeder extends Seeder { /** * Run the database seeds. * * @return void */ public function run() { CompanyType::factory() ->count(3) ->create(); } }
Infine per Company specifichiamo una chiave esterna fissa a 1
<?php // <APP>/database/factories/CompanyFactory.php namespace Database\Factories; use Illuminate\Database\Eloquent\Factories\Factory; class CompanyFactory extends Factory { /** * Define the model's default state. * * @return array */ public function definition() { return [ 'name' => $this->faker->name(), 'website' => $this->faker->url, 'email' => $this->faker->email, 'latitude' => $this->faker->latitude, 'longitude' => $this->faker->longitude, 'company_type_id' => 1, ]; } }
e popoliamo con 10 record:
<?php // <APP>/database/seeders/CompanySeeder.php namespace Database\Seeders; use App\Models\Company; use Illuminate\Database\Seeder; class CompanySeeder extends Seeder { /** * Run the database seeds. * * @return void */ public function run() { Company::factory() ->count(10) ->create(); } }
Per lanciare il comando si torna alla console e si scrive:
$ php artisan db:seed --class=CompanySeederSe
Se non specifichiamo la classe, lancerà tutti i seeder che abbiamo scritto.
Alla fine questo è il risultato:
È possibile anche specificare una localizzazione diversa dalla standard inglese, si va nel file di configurazione dell’applicazione <APP>/config/app.php
e si modifica così la linea:
'faker_locale' => 'it_IT',
Con la nuova localizzazione il risultato è questo
Commenti recenti