85020

Doctrine/Symfony2 Relationship Between 2 Entities over 2 Forms

Question:

Current the following exists:

<strong>Listing Entity</strong>

class Listing { /** * @var integer $id * * @ORM\Column(name="listing_id", type="integer") * @ORM\Id * @ORM\GeneratedValue(strategy="AUTO") */ private $id; /** * @var string $title * * @ORM\Column(name="title", type="string", length=255) */ private $title; /** * @ORM\ManyToOne(targetEntity="IntA\UserBundle\Entity\User", cascade ={"delete"}, inversedBy="listings") * @ORM\JoinColumn(onDelete="CASCADE") */ protected $user; /** * @ORM\OneToMany(targetEntity="IntA\UploadBundle\Entity\Gallery", mappedBy="listing_gallery") * * @var ArrayCollection $image */ private $image; . . . /** * @ORM\ManyToMany(targetEntity="IntA\Bundle\Entity\Tag", cascade={"persist"}) * @ORM\JoinTable(name="listing_tag", * joinColumns={@ORM\JoinColumn(name="listing_id", referencedColumnName="listing_id")}, * inverseJoinColumns={@ORM\JoinColumn(name="tag_id", referencedColumnName="id")} * ) * * @var ArrayCollection $tags */ protected $tags;

<strong>Tag Entity</strong> (Exists, but code not relevant for this problem)

<strong>Gallery Entity</strong>

class Gallery { /** * @ORM\Id * @ORM\Column(type="integer") * @ORM\GeneratedValue(strategy="AUTO") * * @var integer $gallery_id */ protected $gallery_id; /** * @ORM\ManyToOne(targetEntity="IntA\Bundle\Entity\Listing", inversedBy="image") @ORM\JoinColumn(name="listing_id", referencedColumnName="listing_id") * @var integer */ protected $listing_gallery; /** * @ORM\Column(type="string", length="255") * * @var string $name; */ protected $name; /** * @ORM\Column(type="string", length="255") * * @var string $description; */ protected $description; /** * @ORM\Column(type="datetime", name="date_created") * * @var DateTime $date_created */ protected $date_created; /** * @ORM\Column(type="datetime", name="date_updated") * * @var DateTime $date_updated */ protected $date_updated; /** * @ORM\Column(type="text", length="255") * * @var string $url; */ public $url; public $file = array();

<strong>Gallery Controller</strong>

public function uploadAction($id) { $file = new Gallery(); $images_form = $this->createForm(new GalleryType(), $file); $form_view = $images_form->createView(); $form_view->getChild('file')->set('full_name', 'gallery[file][]'); $request = $this->getRequest(); #die(var_dump($request->files)); if ($request->getMethod() === 'POST') { $images_form->bindRequest($request); $data = $images_form->getData(); #die(var_dump($images_form->getData()->getFile())); $em = $this->getDoctrine()->getEntityManager(); $em->persist($file); $related_listing = $em->getRepository('IntABundle:Listing')->find($id); $related_listing->setImage($data); foreach($images_form->getData()->getFile() AS $singleUploadedFile){ $related_listing->setImage($singleUploadedFile); $em->persist($related_listing); } $em->flush(); $uploadedFiles = $em->getRepository('IntABundle:Listing')->findAllImagesPerListing($id); return $this->render('UploadBundle:Gallery:view_uploaded.html.twig', array( 'uploadedFiles' => $uploadedFiles, )); } return $this->render('UploadBundle:Gallery:upload.html.twig', array( 'images_form' => $form_view, 'id' => $id, )); }

Creating a listing (with image="") works without a problem on its form. I have created a separate form in which the user can upload a "Gallery" with multiple images inside of it. The images upload great, but I can't understand how to make a connection between the existing Listing object that the user just created and the images within the Gallery object that they would like to associate with the Listing object.

I'm not sure if my approach to the problem is right or if there exists a better approach. Right now I can create both objects, but not make the appropriate links between them. Is there example code out there to associate objects between two different forms? Perhaps I'm not looking the right places!

Answer1:

Checkout the owning and inverse sides in doctrine relationships: <a href="http://docs.doctrine-project.org/projects/doctrine-orm/en/2.0.x/reference/association-mapping.html" rel="nofollow">http://docs.doctrine-project.org/projects/doctrine-orm/en/2.0.x/reference/association-mapping.html</a>

As far as I can see you need to be setting the relationship from the gallery as the many side should be the owner.

i.e

$gallery->setListing($listing);

rather than

$listing->setImage($gallery)

Because the inverse side of a relationship will not store the relation when you try and save it.

That would have your action looking like:

public function uploadAction($id) { $file = new Gallery(); $images_form = $this->createForm(new GalleryType(), $file); $form_view = $images_form->createView(); $form_view->getChild('file')->set('full_name', 'gallery[file][]'); $request = $this->getRequest(); if ($request->getMethod() === 'POST') { $images_form->bindRequest($request); $em = $this->getDoctrine()->getEntityManager(); $related_listing = $em->getRepository('IntABundle:Listing')->find($id); $file->setListingGallery($related_listing); $em->persist($file); $em->flush(); $uploadedFiles = $em->getRepository('IntABundle:Listing') ->findAllImagesPerListing($id); return $this->render('UploadBundle:Gallery:view_uploaded.html.twig', array( 'uploadedFiles' => $uploadedFiles, )); } return $this->render('UploadBundle:Gallery:upload.html.twig', array( 'images_form' => $form_view, 'id' => $id, )); }

Recommend

  • MySQL query to search for items with certain tags
  • DateTime limits of scale_color_gradient not working only when in for loop in R
  • Is it possible to have a subversion repository as a “submodule” in git?
  • Creating a filterable list using Laravel and Eloquent queries [closed]
  • having a map of strings how to compare it to given string
  • Overwriting/Adding an ActiveRecord association dynamically using a singleton class
  • could not insert select SCOPE_IDENTITY() fluent nhibernate one to many
  • How to update the UI immediately when a new record is added? Related to ember-cli-pagination
  • Convert ctime to unicode and unicode to ctime python
  • Regex: Match everything except backreference
  • update record in database using jdatabase
  • MySQL multiple IN conditions to subquery with same table
  • Is it possible to get the word under the mouse cursor in a ``?
  • BeautifulSoup difference between findAll and findChildren
  • NHibernate manually control fetching
  • Why must we declare a variable name when adding a method to a struct in Golang?
  • Python ImageIO Gif Set Delay Between Frames
  • Generate random number from custom distribution
  • How to add git credentials to the build so it would be able to be used within a shell code?
  • How can the INSERT … ON CONFLICT (id) DO UPDATE… syntax be used with a sequence ID?
  • Groovy: Unexpected token “:”
  • Textfile Structure (tables)
  • QLPreviewController hide print button in ios6
  • ActiveRecord query for a count of new users by day
  • How to create a file in java without a extension
  • R - Combining Columns to String Based on Logical Match
  • Illegal mix of collations for operation for date/time comparison
  • Uncaught Error: Could not find module `ember-load-initializers`
  • req.body is undefined - nodejs
  • MySQL WHERE-condition in procedure ignored
  • Join two tables and save into third-sql
  • How to model a transition system with SPIN
  • ORA-29908: missing primary invocation for ancillary operator
  • Acquiring multiple attributes from .xml file in c#
  • How to CLICK on IE download dialog box i.e.(Open, Save, Save As…)
  • IndexOutOfRangeException on multidimensional array despite using GetLength check
  • How can I remove ASP.NET Designer.cs files?
  • Converting MP3 duration time
  • java string with new operator and a literal
  • How can I use threading to 'tick' a timer to be accessed by other threads?