
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,
));
}