Я новичок в веб-разработке на 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()
]);
}