Entidad Droide para la Relación Muchos a Muchos
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 SubscribeYa hemos probado bien los tipos de relación. Hemos vistoManyToOne
y OneToMany
, que en realidad son el mismo tipo de relación, visto desde lados diferentes. Así que, en realidad, hasta ahora sólo hemos explorado un tipo de relación: ManyToOne
.
¿Qué hay de esa relación OneToOne
de la que tal vez hayas oído hablar? Pues... ¡sorpresa! No es más que un ManyToOne
disfrazado: la base de datos se parece a un ManyToOne
, salvo que tiene una restricción única en la clave externa para asegurarse de que cada lado de la relación sólo puede referirse a un elemento.
La cuestión es que ManyToOne
OneToMany
, y OneToOne
son todos, efectivamente, del mismo tipo de relación.
Entra en los droides
Bien, hablemos de reparación espacial. Para nosotros, los humanos, es un trabajo peligroso: el vacío del espacio, el frío, la falta de oxígeno, las lluvias ocasionales de asteroides y el vacío infinito. Eso sin mencionar cuando Bob se olvidó de asegurar su arnés y se fue flotando hacia su propia frontera final. Tardaron horas en encontrarle. Nunca volvió a ser el mismo después de aquello.
Entonces, ¿quién mejor para abordar esto que nuestros fieles droides?
Diriges un ejército de droides, cada uno está asignado a varias naves estelares y cada nave estelar tiene varios droides. Aquí es donde entra en juego el segundo y último tipo de relación: ManyToMany
.
Para preparar el escenario, necesitamos una entidad Droid
. A estas alturas, ya sabes lo que hay que hacer:
symfony console make:entity Droid
Y así de fácil, ya estamos en marcha. Esto sólo necesita unas pocas propiedades:name
y primaryFunction
. Con las predeterminadas bastará. Eso es todo, muy fácil.
Pero el trabajo de un desarrollador nunca termina. Como somos desarrolladores eficientes, no vagos, copia el comando para generar la migración y ejecútalo:
symfony console make:migration
Echa un vistazo. Aquí no hay sorpresas. Entonces... ejecútalo:
symfony console doctrine:migrations:migrate
Y... tenemos una nueva y reluciente tabla droid
en la base de datos. Todavía no está relacionada con ship
, pero bueno, toda relación tiene que empezar por algún sitio.
Poblar el universo con droides
Antes de poner esto en marcha, ¡vamos a fabricar algunos droides! Ejecuta:
symfony console make:factory Droid
Abre src/Factory/DroidFactory.php
. Ya está listo, pero les falta personalidad. Sustituiré la matriz por datos más interesantes:
// ... lines 1 - 10 | |
final class DroidFactory extends PersistentProxyObjectFactory | |
{ | |
// ... lines 13 - 26 | |
/** | |
* @see https://symfony.com/bundles/ZenstruckFoundryBundle/current/index.html#model-factories | |
* | |
* @todo add your default values here | |
*/ | |
protected function defaults(): array|callable | |
{ | |
return [ | |
'name' => self::faker()->randomElement([ | |
'R2-D2', 'C-3PO', 'BB-8', 'ZZZ-123', | |
]), | |
'primaryFunction' => self::faker()->randomElement([ | |
'astromech', | |
'protocol', | |
'astromech', | |
'assassin', | |
'sleeper', | |
]), | |
]; | |
} | |
// ... lines 47 - 56 | |
} |
Note
Para que esto funcione, actualiza también AppFixtures
para incluir`
php
DroidFactory::createMany(100)
Lo haremos un poco más tarde. Recarga los accesorios con:
symfony console doctrine:fixtures:load
¡Y ahí lo tienes! Una tabla droid
llena hasta los topes de droides dispuestos a ayudar y no a morir en el solitario vacío del espacio. Pero todavía no se puede asignar un droide a una nave. Cambiemos eso con nuestro último tipo de relación: ManyToMany
.
Hi! It looks like there's a missing part between editing
src/Factory/DroidFactory.php
and runningsymfony console doctrine:fixtures:load
. We also need to updatesrc/DataFixtures/AppFixtures.php
.