Estoy usando el siguiente código para crear 20 publicaciones, cada una de las cuales tiene 3 comentarios.
Post::factory() ->times(20) ->has(Comment::factory()->times(3)) ->create()En su lugar, me gustaría crear 20 publicaciones, cada una de las cuales tiene un número aleatorio de comentarios (por ejemplo, la publicación 1 tiene 2 comentarios, la publicación 2 tiene 4 comentarios, etc.)
Esto no funcionó, cada publicación tenía el mismo número (aleatorio) de comentarios.
Post::factory() ->times(20) ->has(Comment::factory()->times(rand(1, 5))) ->create()¿Cómo puedo conseguir esto?
No es posible tener un número dinámico de modelos relacionados por modelo si está usando ->times hasta donde yo sé. En su lugar, puede intentar:
collect(range(0,19)) ->each(function () { Post::factory() ->has(Comment::factory()->times(rand(1,5))) ->create(); });Esto debería crear 20 publicaciones una por una con un número aleatorio de comentarios en cada una. Puede ser un poco más lento, pero probablemente no mucho
Usaría un método de fábrica para hacer esto. Agregue un método a su fábrica de Post como este:
<?php namespace Database\Factories\App; use App\Comment; use App\Post; use Illuminate\Database\Eloquent\Factories\Factory; class PostFactory extends Factory { public function definition(): array { return [ // ... ]; } public function addComments(int $count = null): self { $count = $count ?? rand(1, 5); return $this->afterCreating( fn (Post $post) => Comment::factory()->count($count)->for($post)->create() ); } }Luego, en su prueba, simplemente puede llamarlo así:
Post::factory()->count(20)->addComments()->create();Actualizado: Eso debería funcionar: Inspirado en apokryfos. Si eso no funciona, eso:
for($i=0; $i<20; $i++) { $times = rand(1,5); Post::factory() ->has(Comment::factory()->times($times)) ->create(); }