Laravel: costruire tabelle, model, controller e creare dati con Faker

Spread the love

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 .

Creazione delle migrazioni

Creiamo le migrazioni due migrazioni per queste tabelle collegate da una relazione 1 a molti:

Diagramma  E/R per utilizzare Faker
Diagramma E/R per utilizzare Faker

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:

faker_dbeaver_tables
Dbeaver mostra tabelle e relazionetra esse

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:

Come Faker popola i record della tabella companies
Come Faker popola i record della tabella companies

È 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

Laravel: Faker con localizzzione italiana
Laravel: Faker con localizzzione italiana

Risorse

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.