⬆️ Go to main menu ⬅️ Previous (Artisan) ➡️ Next (Log and debug)
- Factory callbacks
- Generate Images with Seeds/Factories
- Override values and apply custom login to them
- Using factories with relationships
- Create models without dispatching any events
- Useful for() method
- Run factories without dispatching events
- Specify dependencies in the run() method
Mientras usamos Factories para insertar datos, podemos añadirle un Callback a las funciones para realizar alguna acción después de que los registros son insertados.
$factory->afterCreating(App\User::class, function ($user, $faker) {
$user->accounts()->save(factory(App\Account::class)->make());
});
¿Sabías que la clase Faker puede generar no solo texto sino imagenes? En este ejemplo el atributo avatar insertamos una imagen 50x50:
$factory->define(User::class, function (Faker $faker) {
return [
'name' => $faker->name,
'email' => $faker->unique()->safeEmail,
'email_verified_at' => now(),
'password' => bcrypt('password'),
'remember_token' => Str::random(10),
'avatar' => $faker->image(storage_path('images'), 50, 50)
];
});
Cuando creamos registros con Factories, podemos usar la clase Sequence para sobrescribir valores y así generar diferente lógica.
$users = User::factory()
->count(10)
->state(new Sequence(
['admin' => 'Y'],
['admin' => 'N'],
))
->create();
Laravel provee soporte para aplicar métodos mágicos a las relaciones usando Factories.
// factories con métodos mágicos en las relaciones
User::factory()->hasPosts(3)->create();
// en vez de esto
User::factory()->has(Post::factory()->count(3))->create();
⭐ Aportación de @oliverds_
Para evitar disparar algun evento sobre el modelo cuando utilizamos métodos como: update, create
es necesario usar métodos como: updateQuietly, createQuietly
.
Post::factory()->createOneQuietly();
Post::factory()->count(3)->createQuietly();
Post::factory()->createManyQuietly([
['message' => 'A new comment'],
['message' => 'Another new comment'],
]);
En Laravel el método for()
es bastante util para crear relaciones tipo belongsTo()
.
public function run()
{
Product::factory()
->count(3)
->for(Category::factory()->create())
->create();
}
⭐ Aportación de @mmartin_joo
Si deseas crear registros masviamente sin lanzar eventos usando Factories necesitamos envolver nuestro código dentro de el método `withoutEvents
$posts = Post::withoutEvents(function () {
return Post::factory()->count(50)->create();
});
⭐ Aportación de @TheLaravelDev
Puedes especificar algunas dependecias en el método run()
del seeder.
class DatabaseSeeder extends Seeder
{
public function run()
{
$user = User::factory()->create();
$this->callWith(EventSeeder::class, [
'user' => $user
]);
}
}
class EventSeeder extends Seeder
{
public function run(User $user)
{
Event::factory()
->when($user, fn($f) => $f->for('user'))
->for(Program::factory())
->create();
}
}
⭐ Aportación de @justsanjit