Nei test e nel seeding del database devi inserire record.
Anziché indicare manualmente il valore di ogni colonna, con le factory dei modelli di Laravel puoi definire un set di attributi predefiniti per ciascun modello Eloquent.Ogni nuova applicazione Laravel include già database/factories/UserFactory.php.
namespace Database\Factories;use Illuminate\Database\Eloquent\Factories\Factory;use Illuminate\Support\Facades\Hash;use Illuminate\Support\Str;class UserFactory extends Factory{ // Manteniamo in cache la password per non re-hashare la stessa ogni volta protected static ?string $password; public function definition(): array { return [ 'name' => fake()->name(), 'email' => fake()->unique()->safeEmail(), 'email_verified_at' => now(), 'password' => static::$password ??= Hash::make('password'), 'remember_token' => Str::random(10), ]; }}
Tramite l’helper fake() puoi usare la libreria Faker, che genera vari dati casuali.
Puoi cambiare la localizzazione di Faker con l’opzione faker_locale in config/app.php.
Se usi il trait HasFactory sul modello, Laravel trova automaticamente la factory corrispondente.
Cerca nel namespace Database\Factories una classe il cui nome è quello del modello con Factory in coda.Se la convenzione di naming non è rispettata, puoi indicarla esplicitamente con l’attributo UseFactory.
use Illuminate\Database\Eloquent\Attributes\UseFactory;use Database\Factories\Administration\FlightFactory;#[UseFactory(FlightFactory::class)]class Flight extends Model{ // ...}
use App\Models\User;// Genera 1 record$user = User::factory()->make();// Genera 3 record (restituiti come collection)$users = User::factory()->count(3)->make();
Se durante la generazione di più modelli vuoi alternare gli attributi, usa Sequence.
use App\Models\User;use Illuminate\Database\Eloquent\Factories\Sequence;$users = User::factory() ->count(10) ->state(new Sequence( ['admin' => 'Y'], ['admin' => 'N'], )) ->create();// 5 vengono generati con admin='Y' e 5 con admin='N'
Con for() indichi il modello padre a cui appartiene.
use App\Models\Post;use App\Models\User;// Genera 3 Post che appartengono a uno specifico utente$posts = Post::factory() ->count(3) ->for(User::factory()->state(['name' => 'Giulia Bianchi'])) ->create();// Usa un modello esistente come padre$user = User::factory()->create();$posts = Post::factory()->count(3)->for($user)->create();
Se in definition() assegni un’altra factory a una chiave esterna, durante la creazione del modello viene generato automaticamente anche il modello padre.
class PostFactory extends Factory{ public function definition(): array { return [ 'user_id' => \App\Models\User::factory(), 'title' => fake()->sentence(), 'content' => fake()->paragraph(), ]; }}
Se vuoi riutilizzare la stessa istanza per più relazioni, usa recycle().
// Riutilizza la stessa Airline in Ticket e FlightTicket::factory() ->recycle(Airline::factory()->create()) ->create();// Sceglie casualmente da una collection$airlines = Airline::factory()->count(3)->create();Ticket::factory()->count(10)->recycle($airlines)->create();