2016-03-23 7 views
0

Ich habe ein Problem mit MU-Eins-zu-Viele-Beziehungen in Symfony2. Ich habe Firmen- und Benutzerklassen. Ein Unternehmen hat einige Benutzer als HR und einige Benutzer haben Firmen-Arbeitgeber. Es gibt Teile des Codes:Symfony2 One-to-Many-Editieraktion

/** 
* @ORM\Entity 
* @ORM\Table(name="fos_user") 
*/ 
class User extends BaseUser 
{ 
/** 
* @ORM\Id 
* @ORM\Column(type="integer") 
* @ORM\GeneratedValue(strategy="AUTO") 
*/ 
protected $id; 

/** 
* @ORM\ManyToOne(targetEntity="Company", inversedBy="hrs") 
* @ORM\JoinColumn(name="company_id", referencedColumnName="id") 
*/ 
protected $employer; 
.... 
.... 
.... 
    /** 
    * Set employer 
    * 
    * @param \JobFyBundle\Entity\Company $employer 
    * @return User 
    */ 
    public function setEmployer(\JobFyBundle\Entity\Company $employer = null) 
    { 
     $this->employer = $employer; 
     $employer->addHrs($this); 

     return $this; 
    } 

    /** 
    * Get employer 
    * 
    * @return \JobFyBundle\Entity\Company 
    */ 
    public function getEmployer() 
    { 
     return $this->employer; 
    } 
} 

Es ist ein Teil der Unternehmensklasse

/** 
* @ORM\Entity(repositoryClass="CompanyRepository") 
* @ORM\Table(name="jobfy_company") 
*/ 
class Company { 
    /** 
    * @ORM\Id() 
    * @ORM\Column(type="integer") 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    protected $id; 
... 
... 
... 
/** 
    * Add hrs 
    * 
    * @param User $hr 
    * @return Company 
    * @internal param User $hrs 
    */ 
    public function addHrs(\JobFyBundle\Entity\User $hr) 
    { 
     $this->getHrs()->add($hr); 
     $hr->setEmployer($this); 

     return $this; 
    } 

    /** 
    * Remove hrs 
    * 
    * @param \JobFyBundle\Entity\User $hrs 
    */ 
    public function removeHr(\JobFyBundle\Entity\User $hrs) 
    { 
     $this->hrs->removeElement($hrs); 
    } 

    /** 
    * Get hrs 
    * 
    * @return \Doctrine\Common\Collections\Collection 
    */ 
    public function getHrs() 
    { 
     return $this->hrs; 
    } 
} 

Ich versuche, bearbeiten Aktion zu machen, damit mehr hr die Zugabe.

Hier ist ein Teil CompanyController:

/** 
* Displays a form to edit an existing Company entity. 
* 
* @Route("/{id}/edit", name="company_edit") 
* @Method({"GET", "POST"}) 
*/ 
public function editAction(Request $request, Company $company) 
{ 
    $deleteForm = $this->createDeleteForm($company); 
    $editForm = $this->createForm('JobFyBundle\Form\CompanyType', $company, array('csrf_protection' => false)); 
    $editForm->handleRequest($request); 

    $em = $this->getDoctrine()->getManager(); 
    $people = $em->getRepository('JobFyBundle:User')->findAll(); 

    if ($editForm->isSubmitted() && $editForm->isValid()) { 
     $em = $this->getDoctrine()->getManager(); 
     $em->persist($company); 
     $em->flush(); 

     return $this->redirectToRoute('company_show', array('id' => $company->getId())); 
    } 

    return $this->render('company/edit.html.twig', array(
     'company' => $company, 
     'hrs' => $people, 
     'edit_form' => $editForm->createView(), 
     'delete_form' => $deleteForm->createView(), 
    )); 
} 

Und es ist eine Vorlage von Aktion bearbeiten.

{% extends 'base.html.twig' %} 

{% block body %} 
    <div class="container"> 
     <form name="company" method="post" class="form-new"> 
      <h1 class="form-new-heading">Edit company</h1> 
      <div id="cv"> 
       <div> 
        <label for="company_title">Company title</label> 
        <textarea id="company_title" name="company[title]" class="form-control" 
           required autofocus>{{ company.title }}</textarea> 
        <label for="company_url">Company url</label> 
        <textarea id="company_url" name="company[url]" class="form-control" 
         >{{ company.url }}</textarea> 
        <label for="company_about_us">About us</label> 
        <textarea id="company_about_us" name="company[about_us]" 
           class="form-control" rows="15">{{ company.getAboutUs }}</textarea> 
        <div> 
         <label for="company_hrs">HRs</label> 
         <select id="company_hrs" name="company[hrs][]" multiple="multiple" class="form-control"> 
          {% for hr in hrs %} 
           <option value="{{ hr.id }}" 
             {% if hr.employer is not null and hr.employer.id == company.id %} 
              selected="selected" 
             {% endif %} 
           >{{ hr }}</option> 
          {% endfor %} 
         </select> 
        </div> 
        <button class="btn btn-lg btn-success" type="submit">Submit</button> 
       </div> 
      </div> 
     </form> 
     <h3><a href="{{ path('company_index_paginate') }}">Show companies list</a></h3> 
    </div> 
{% endblock %} 

Alles funktioniert, außer Hinzufügen oder Bearbeiten der hr's Liste. Vielen Dank für Ihre Hilfe!

+0

'$ hrs' ist ein [Arraycollection] (http://doctrine-orm.readthedocs.org/projects/ doctrine-orm/de/latest/reference/association-mapping.html), setzen Sie dies in Ihrem '__construct()' der Entität 'Firma'? 'öffentliche Funktion __construct() {$ this-> hrs = new ArrayCollection(); } ' – Egg

+0

Nein, habe ich nicht. Ich habe es jetzt eingestellt, aber leider hat es nicht geholfen. Aber danke! –

Antwort

0

Ich habe ein Problem gelöst.

public function editAction(Request $request, Company $company) 
{ 
    $deleteForm = $this->createDeleteForm($company); 
    $editForm = $this->createForm('JobFyBundle\Form\CompanyType', $company, array('csrf_protection' => false)); 
    $editForm->handleRequest($request); 

    $em = $this->getDoctrine()->getManager(); 
    $people = $em->getRepository('JobFyBundle:User')->findAll(); 

    foreach ($company->getHrs() as $hr){ 
     $company->removeHr($hr); 
    } 

    if ($editForm->isSubmitted() && $editForm->isValid()) { 
     foreach ($_POST['company']['hrs'] as $hr_id){ 
      $hr = $em->getRepository('JobFyBundle:User')->find($hr_id); 
      $company->addHrs($hr); 
      $hr->setEmployer($company); 
     } 

     $em->persist($company); 
     $em->flush(); 
     return $this->redirectToRoute('company_show', array('id' => $company->getId())); 
    } 

    return $this->render('company/edit.html.twig', array(
     'company' => $company, 
     'hrs' => $people, 
     'edit_form' => $editForm->createView(), 
     'delete_form' => $deleteForm->createView(), 
    )); 
} 

Es kann für jemanden nützlich sein, also werde ich es dort lassen :)