Skip to content

Instantly share code, notes, and snippets.

@ricardov03
Created January 20, 2025 16:12
Show Gist options
  • Save ricardov03/2afd4bab3b595a465818c7fb4f4cc1b1 to your computer and use it in GitHub Desktop.
Save ricardov03/2afd4bab3b595a465818c7fb4f4cc1b1 to your computer and use it in GitHub Desktop.
Sample of a MultiDefinition Factory
<?php
namespace Database\Factories;
use App\Enums\DocumentTypesEnum;
use App\Enums\MemberTypesEnum;
use App\Enums\PetTypesEnum;
use App\Services\PetNameService;
use Illuminate\Database\Eloquent\Factories\Factory;
use Illuminate\Support\Arr;
/**
* @extends \Illuminate\Database\Eloquent\Factories\Factory<\App\Models\Member>
*/
class MemberFactory extends Factory
{
/**
* Define the model's default state.
*
* @return array<string, mixed>
*/
public function definition(): array
{
$memberType = Arr::random(MemberTypesEnum::cases())->value;
return match ($memberType) {
MemberTypesEnum::STAFF->value => $this->staffMemberFactory(),
MemberTypesEnum::FAMILY_MEMBER->value => $this->familyMemberFactory(),
MemberTypesEnum::FRIEND->value => $this->friendFactory(),
MemberTypesEnum::PET->value => $this->petFactory(),
MemberTypesEnum::DELIVERY->value => $this->deliveryFactory(),
MemberTypesEnum::TECHNICIAN->value => $this->technicianFactory(),
};
}
private function staffMemberFactory()
{
$documentType = Arr::random(DocumentTypesEnum::cases())->value;
return [
'name' => $this->faker->name(),
'document_type' => $documentType,
'document_number' => $this->faker->unique()->numerify('###########'),
'member_type' => MemberTypesEnum::STAFF->value,
'main_phone' => $this->faker->phoneNumber(),
'email' => $this->faker->unique()->safeEmail(),
'allowed_from' => $this->faker->dateTimeBetween('-1 year', 'now')->format('Y-m-d'),
'allowed_to' => $this->faker->dateTimeBetween('now', '+1 year')->format('Y-m-d'),
];
}
private function familyMemberFactory()
{
return [
'name' => $this->faker->name(),
'document_type' => DocumentTypesEnum::NATIONAL_ID->value,
'document_number' => $this->faker->unique()->numerify('###########'),
'member_type' => MemberTypesEnum::FAMILY_MEMBER->value,
'main_phone' => $this->faker->phoneNumber(),
'email' => $this->faker->unique()->safeEmail(),
'is_kid' => $this->faker->boolean(),
];
}
private function friendFactory()
{
$documentType = Arr::random(DocumentTypesEnum::cases())->value;
return [
'name' => $this->faker->name(),
'document_type' => $documentType,
'document_number' => $this->faker->unique()->numerify('###########'),
'member_type' => MemberTypesEnum::FRIEND->value,
'main_phone' => $this->faker->phoneNumber(),
'email' => $this->faker->unique()->safeEmail(),
'is_kid' => $this->faker->boolean(),
];
}
public function petFactory()
{
return [
'name' => PetNameService::getRandomPetName(),
'member_type' => MemberTypesEnum::PET->value,
'pet_type' => Arr::random(PetTypesEnum::cases())->value,
'is_danger' => $this->faker->boolean(),
];
}
private function deliveryFactory()
{
$documentType = Arr::random(DocumentTypesEnum::cases())->value;
return [
'name' => $this->faker->name(),
'document_type' => $documentType,
'document_number' => $this->faker->unique()->numerify('###########'),
'member_type' => MemberTypesEnum::DELIVERY->value,
'main_phone' => $this->faker->phoneNumber(),
'email' => $this->faker->unique()->safeEmail(),
'allowed_from' => $this->faker->dateTimeBetween('-1 year', 'now')->format('Y-m-d'),
'allowed_to' => $this->faker->dateTimeBetween('now', '+1 year')->format('Y-m-d'),
];
}
private function technicianFactory()
{
$documentType = Arr::random(DocumentTypesEnum::cases())->value;
return [
'name' => $this->faker->name(),
'document_type' => $documentType,
'document_number' => $this->faker->unique()->numerify('###########'),
'member_type' => MemberTypesEnum::TECHNICIAN->value,
'main_phone' => $this->faker->phoneNumber(),
'email' => $this->faker->unique()->safeEmail(),
'allowed_from' => $this->faker->dateTimeBetween('-1 year', 'now')->format('Y-m-d'),
'allowed_to' => $this->faker->dateTimeBetween('now', '+1 year')->format('Y-m-d'),
];
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment