Este foro ya no está activo, así que no puedes publicar nuevas preguntas ni responder a las preguntas existentes.

Como crear fixtures para una relación many to many

5 de marzo de 2016

Buenos días.

No tengo claro como crear las fixtures para una relación many to many, en internet veo ejemplos del resto de tipos pero de este nada.

Tengo una tabla película y otra tabla actor, doctrine me ha creado automáticamente la tabla películas_actores.

¿Como puedo crear las fixtures? sería para crear unas 50, imagino que dentro de un for, no encuentro la manera de hacerlo.

Sólo pido algo de orientación, algún enlace explicándolo, ...

Muchas gracias.


Respuestas

#1

Hola @mariogtt89,

En teoria lo primero que tendrías que hacer es crearte dos arrays, uno para las películas y otro para los actores y en la propiedad que tiene la relacion tendrias que agregar las regerencias de las dos.

COmo te digo, eso es en teoría,

$peliculas = array (
    'peli_01' => array('nombre' => 'Matrix', 'actores' => array($manager->merge($this->getReference('ca_01')))),
);
 
$actores = array (
    'ac_01' => array('nombre' => 'Keanu Reeves', 'peliculas' => array($manager->merge($this->getReference('peli_01'))))
)

Como ves, las relaciones dentro del archivo Fixtures se hacen por referencia, en $manager->merge($this->getReference('ca_01')) ca_01 debe existir en otro array para que haga la relación.

Esto es pura especulación, la verdad no he realizado un cargue por fixtures de relaciones ManyToMany, prueba y si funciona seria bueno que avises.

Saludos,

@miguelplazasr

6 marzo 2016, 5:14
#2

No se como agregar lo que me dices, te pego algo de código.

<?php
 
namespace AppBundle\DataFixtures\ORM;
 
use AppBundle\Entity\Media;
use Doctrine\Common\DataFixtures\AbstractFixture;
use Doctrine\Common\DataFixtures\OrderedFixtureInterface;
use Doctrine\Common\Persistence\ObjectManager;
use Symfony\Component\DependencyInjection\ContainerAwareInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;
 
class Medias extends AbstractFixture implements OrderedFixtureInterface, ContainerAwareInterface
{
    /**
     * @var ContainerInterface
     */
    private $container;
 
    public function getOrder()
    {
        return 70;
    }
 
    public function load(ObjectManager $manager)
    {
        for($i=1; $i <500; $i++) {
 
            $mediaTypes = $manager->getRepository('AppBundle:MediaType')->findAll();
            $genders    = $manager->getRepository('AppBundle:Gender')->findAll();
            $mediaType  = $mediaTypes[array_rand($mediaTypes)];
            $gender     = $genders[array_rand($mediaTypes)];
 
            $media = new Media();
            $media->setMediaType($mediaType);
            $media->setGender($gender);
            $media->setTitle('Title '.$i);
            $media->setSlug($this->container->get('slugger')->slugify($media->getTitle()));
            $media->setYear(rand(1980, 2016));
            $media->setPlot(
                $i.'Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor.
                Aenean massa. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.
                Donec quam felis, ultricies nec, pellentesque eu, pretium quis, sem. Nulla consequat massa quis enim.
                Donec pede justo, fringilla vel, aliquet nec, vulputate eget, arcu. In enim justo, rhoncus ut,
                imperdiet a, venenatis vitae, justo. Nullam dictum felis eu pede mollis pretium.
                Integer tincidunt. Cras dapibus. Vivamus elementum semper nisi. Aenean vulputate eleifend tellus.
                Aenean leo ligula, porttitor eu, consequat vitae, eleifend ac, enim. Aliquam lorem ante, dapibus in,
                viverra quis, feugiat a, tellus. Phasellus viverra nulla ut metus varius laoreet. Quisque rutrum.
                Aenean imperdiet. Etiam ultricies nisi vel augue. Curabitur ullamcorper ultricies nisi.
                Nam eget dui. Etiam rhoncus.'
            );
            $media->setImg('test-image.jpg');
            $media->setTrailer('test-link');
            $manager->persist($media);
 
        }
        $manager->flush();
    }
 
    public function setContainer(ContainerInterface $container = null)
    {
        $this->container = $container;
    }
}
<?php
 
namespace AppBundle\DataFixtures\ORM;
 
use AppBundle\Entity\Person;
use Doctrine\Common\DataFixtures\AbstractFixture;
use Doctrine\Common\DataFixtures\OrderedFixtureInterface;
use Symfony\Component\DependencyInjection\ContainerAwareInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Doctrine\Common\Persistence\ObjectManager;
 
class Persons extends AbstractFixture implements OrderedFixtureInterface, ContainerAwareInterface
{
    /**
     * @var ContainerInterface
     */
    private $container;
 
    public function getOrder()
    {
        return 60;
    }
 
    public function  load(ObjectManager $manager)
    {
        for($i=1; $i <100; $i++) {
            $person = new Person();
            $person->setName('Person'.$i);
            $person->setSlug($this->container->get('slugger')->slugify($person->getName()));
            $person->setAge(rand(16, 89));
            $person->setBirthplace($this->getBirthPace());
            $person->setBiography(
                'Person'.$i.'  Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.
                Donec quam felis, ultricies nec, pellentesque eu, pretium quis, sem. Nulla consequat massa quis enim.
                Donec pede justo, fringilla vel, aliquet nec, vulputate eget, arcu. In enim justo, rhoncus ut,
                imperdiet a, venenatis vitae, justo. Nullam dictum felis eu pede mollis pretium.
                Integer tincidunt. Cras dapibus.'
            );
            $manager->persist($person);
        }
 
        $manager->flush();
    }
 
    public function getBirthPace()
    {
        $birthPlace = array(
            'Albania',
            'Alemania',
            'Argentina',
            'Australia',
            'Austria',
            'Bélgica',
            'Bulgaria',
            'China',
            'Colombia',
            'Cuba',
            'España',
            'Estados Unidos',
            'Francia',
            'Grecia',
            'Guatemala',
            'Italia',
            'Portugal',
            'Reino Unido',
            'Vietnam'
        );
 
        return $birthPlace[array_rand($birthPlace)];
    }
 
    public function setContainer(ContainerInterface $container = null)
    {
        $this->container = $container;
    }
}
Entity Media:
---------------
    /**
     * @ORM\ManyToMany(targetEntity="Person", inversedBy="medias", cascade={"persist", "remove" })
     * @JoinTable(name="medias_persons",
     *     joinColumns={@JoinColumn(name="media_id", referencedColumnName="id")},
     *     inverseJoinColumns={@JoinColumn(name="person_id", referencedColumnName="id")}
     *     )
     */
    private $persons;
 
Entity Person:
----------------
    /**
     * @ORM\ManyToMany(targetEntity="Media", mappedBy="persons")
     */
    private $medias;

@mariogtt89

6 marzo 2016, 12:54
#3

Tengo un ejemplo en este Gist que lo uso para cargar Países, ciudades y provincias.

Tómalo como guía y si necesitas mas explicación no dudes en escribir.

Saludos

@miguelplazasr

7 marzo 2016, 19:51