Search code examples
phpsymfonydoctrinefixtures

How to match model with the good brand?


i'm trying to make fake data with faker on symfony.

I have 2 entities Brand and Model with OneToMany relation :

/**
 * @ORM\OneToMany(targetEntity=Model::class, mappedBy="brand")
 */
private $models;


/**
 * @ORM\ManyToOne(targetEntity=Brand::class, inversedBy="models")
 * @ORM\JoinColumn(nullable=false)
 */
private $brand;

The goal is to match the good brand with a specific model. For example, when model it's 911 or 356 brand has to be Porsche.

Here my fixture :

 public function load(ObjectManager $manager): void
    {
        $faker = Factory::create('fr_FR');

        $brands = ['Porsche', 'Chevrolet', 'Aston Martin', 'Ferrari'];
        foreach ($brands as $brand) {
            $newBrand = new Brand();
            $newBrand->setName($brand);
            $manager->persist($newBrand);


            $models = [911, 356, 'Corvette', 'Camaro', 'V8', 'DB4', 328, 'F430'];
            foreach ($models as $model) {
                $newModel = new Model();

                if ($model == 911 || $model == 356) {
                    $newModel->setBrand($newBrand);
                } elseif ($model == 'Corvette' || $model == 'Camaro') {
                    $newModel->setBrand();
                } elseif ($model == 'V8' || $model == 'DB4') {
                    $newModel->setBrand();
                } else {
                    $newModel->setBrand();
                }
                $newModel->setTransmission($faker->randomElement(['manual', 'automatic']))
                    ->setName($model);

                for ($i=1; $i<=6; $i++) {
                    $newModel->setImage("model$i.jpg");
                }

                $newModel->setColor($faker->randomElement(['red', 'black', 'yellow', 'blue']))
                    ->setFuelType($faker->randomElement(['diesel fuel', 'gasoline', 'ethanol']))
                    ->setPrice($faker->numberBetween($min=20000, $max=150000));

                $manager->persist($newModel);
            }

        }

       $manager->flush();
    }

Solution

  • I simplified my code to achieve my goal, here is my function :

        public function load(ObjectManager $manager): void
        {
            $faker = Factory::create('fr_FR');
    
            $brands = ['Porsche', 'Chevrolet', 'Aston Martin', 'Ferrari'];
            $brand1 = new Brand();
            $brand1->setName('Porsche');
            $manager->persist($brand1);
    
            $brand2 = new Brand();
            $brand2->setName('Chevrolet');
            $manager->persist($brand2);
    
            $brand3 = new Brand();
            $brand3->setName('Aston Martin');
            $manager->persist($brand3);
    
            $brand4 = new Brand();
            $brand4->setName('Ferrari');
            $manager->persist($brand4);
    
            $models = [911, 356, 'Corvette', 'Camaro', 'V8', 'DB4', 328, 'F430'];
            foreach ($models as $model) {
                $newModel = new Model();
    
                if ($model == 911 || $model == 356) {
                    $newModel->setBrand($brand1);
                } elseif ($model == 'Corvette' || $model == 'Camaro') {
                    $newModel->setBrand($brand2);
                } elseif ($model == 'V8' || $model == 'DB4') {
                    $newModel->setBrand($brand3);
                } else {
                    $newModel->setBrand($brand4);
                }
                $newModel->setTransmission($faker->randomElement(['manual', 'automatic']))
                    ->setName($model);
    
                for ($i=1; $i<=6; $i++) {
                    $newModel->setImage("model$i.jpg");
                }
    
                $newModel->setColor($faker->randomElement(['red', 'black', 'yellow', 'blue']))
                    ->setFuelType($faker->randomElement(['diesel fuel', 'gasoline', 'ethanol']))
                    ->setPrice($faker->numberBetween($min=20000, $max=150000));
    
                $manager->persist($newModel);
            }