В чем разница между OneToOne и ManyToOne, когда дело доходит до сохранения базы данных? - PullRequest
1 голос
/ 24 сентября 2019

Я новичок в веб-разработке на PHP и использую Symfony 4. У меня есть сущность Product, которая имеет отношение OneToOne с сущностью Photo.В контроллере, когда я создаю связь между ними и сохраняю сущность Product в базе данных, автоматически загружается и фотография.Однако с другими объектами, связанными с Product ManyToOne, я должен сохранять их отдельно в контроллере, даже если я создал отношение.Может кто-нибудь объяснить мне, почему это происходит?

  public function createProductAction(EntityManagerInterface $em, Request $request) {


      $product = new Product();

      $photo = new Photo();


      $form = $this->createForm(NewProductForm::class);

      $form->handleRequest($request);

      if($form->isSubmitted() && $form->isValid())
      {

          $file = $request->files->get('new_product_form')['photo'];
          $directory = $this->getParameter('photos_directory');
          $filename = md5(uniqid()) . '.' . $file->guessExtension();

          $file->move(
            $directory,
            $filename
          );

          $data = $form->getData();
          $product->setName($data['name']);
          $product->setColor($data['color']);


          $photo->setName($filename);


          $product->setPhoto($photo);


          $em = $this->getDoctrine()->getManager();
          $em->persist($product);

          $em->flush();

          return $this->redirectToRoute('products');

      }



      return $this->render('productsPage/createProduct.html.twig', [

        'productTypeForm' => $form->createView()

      ]);

    }

    /**
     * @Route("/products/{slug}")
     */
    public function review($slug,EntityManagerInterface $em, Request $request) {

      $product = $this->getDoctrine()->getRepository(Product::class)->find($slug);
      $photo = $this->getDoctrine()->getRepository(Photo::class)->find($product->getPhoto()->getId());
      $comments = new Comments();

      $ratings = new Rating();

      $form = $this->createForm(ReviewProductForm::class);

      $form -> handleRequest($request);




      if($form->isSubmitted() && $form->isValid())
      {


        $data = $form ->getData();
        $comments->setComment($data['comment']);
        $ratings->setRating($data['rating']);

        // $product->addComment($comments);
        // $product->addRating($ratings);

        $comments->setProduct($product);
        $ratings->setProduct($product);

        $em = $this->getDoctrine()->getManager();


        //Flush the ratings to the DB so the value can be updated immedietly after review submit
        $em->persist($comments);
        $em->persist($ratings);
        $em->flush();

        //Get the avg value from the rating DB to set the products avg rating
        $avgRating = $this->getDoctrine()->getRepository(Rating::class)->avgRating($slug);
        $product->setAvgRat($avgRating[0][1]);

        //Flush the product to the DB
        $em->persist($product);
        $em->flush();

        $form = $this->createForm(ReviewProductForm::class);
        return $this->redirect($request->getUri());

      }





      return $this->render('productsPage/productReview.html.twig', [

        'form' => $form->createView(),
        'product' => $product,
        'photo' => $photo,
        'comments' => $product->getComments()

      ]);

    }
...