Muchos a muchos con Foundry
Keep on Learning!
If you liked what you've learned so far, dive in! Subscribe to get access to this tutorial plus video, code and script downloads.
With a Subscription, click any sentence in the script to jump to that part of the video!
Login Subscribe¿Recuerdas en AppFixtures
cuando asignábamos manualmente un Droid
a unStarship
? ¡Aquello era divertido! Pero ahora, quiero crear un ejército de droids
, una flota de starships
y asignarlos todos a la vez.
Deshazte de esas asignaciones manuales de Droid
y Starship
en AppFixtures
.
Crear el ejército droide y la flota de naves estelares
Acércate a la parte inferior donde creamos starships
y parts
. Ahora también necesitamos un montón de droids
:DroidFactory::createMany(100)
.
A continuación, asigna droids
a DroidFactory::randomRange(1, 5)
:
// ... lines 1 - 12 | |
class AppFixtures extends Fixture | |
{ | |
public function load(ObjectManager $manager): void | |
{ | |
// ... lines 17 - 50 | |
DroidFactory::createMany(100); | |
StarshipFactory::createMany(100, [ | |
'droids' => DroidFactory::randomRange(1, 5), | |
]); | |
// ... line 56 | |
} | |
} |
Esto asignará entre 1 y 5 droids
aleatorios a cada Starship
.
La magia de Symfony
Tal vez te hayas dado cuenta de algo: aquí estamos estableciendo una propiedad droids
, ¡pero enStarship
, no tenemos un método setDroids()
! Normalmente, esto provocaría un error furioso. Pero funcionará! Foundry ve que tenemos un método addDroid()
, y lo llama en su lugar, uno a uno para cada Droid
.
Ejecuta la prueba
¡Es hora de ver esto en acción! Busca tu terminal y ejecuta:
symfony console doctrine:fixtures:load
¿No hay errores? Yo también estoy un poco sorprendido, ejem, encantado. Echa un vistazo a droids
con:
symfony console doctrine:query:sql 'SELECT * FROM droid'
100 droides alocados y adorables. Echa también un vistazo a la tabla starship_droid
:
symfony console doctrine:query:sql 'SELECT * FROM starship_droid'
Debería parecer que hay un conjunto aleatorio de droides asignado a cada starship
Espera, ¡algo no va bien!
Pero espera un momento. Estos droides "aleatorios" -¿percibes mis comillas sarcásticas? - ¡no son aleatorios en absoluto! Son los 3 mismos droides una y otra vez. El problema es que randomRange(1, 5)
sólo se llama una vez: así que está asignando los mismos 1 a 5 droides aleatorios a cadaStarship
. No es la variedad que esperábamos.
Cierres y Fundición
Arréglalo pasando un cierre: StarshipFactory::createMany()
, 100,fn() =>
[ 'droids' => DroidFactory::randomRange(1, 5)]):
// ... lines 1 - 12 | |
class AppFixtures extends Fixture | |
{ | |
public function load(ObjectManager $manager): void | |
{ | |
// ... lines 17 - 50 | |
DroidFactory::createMany(100); | |
StarshipFactory::createMany(100, fn() => [ | |
'droids' => DroidFactory::randomRange(1, 5), | |
]); | |
// ... line 56 | |
} | |
} |
Foundry ejecutará la llamada de retorno para las 100 naves. Esto significa que randomRange(1, 5)
se llamará 100 veces, lo que nos dará un rango verdaderamente aleatorio para cada nave.
¡Pruébalo! Vuelve a ejecutar las fijaciones y carga la consulta SQL:
symfony console doctrine:fixtures:load
symfony console doctrine:query:sql 'SELECT * FROM starship_droid'
Disfruta de la gloria de un conjunto de droides asignados a naves estelares realmente aleatorio.
También podríamos haberlo arreglado moviendo la clave droids
aStarshipFactory
en el método defaults()
. Pero me gusta conservardefaults()
para las propiedades necesarias. Y como droids
no son técnicamente necesarias -¡buena suerte limpiando el baño sin ellas! - Me gusta mantenerlas fuera de defaults()
y establecerlas donde utilicemosStarshipFactory
.
A continuación, aprenderemos a hacer JOIN entre relaciones ManyToMany
. Una vez más, Doctrine se encarga del trabajo pesado por nosotros.
Hi, I did find an error in the last step when loading the fixtures:
In AppFixtures.php line 25:
Warning: Undefined variable $starship