title: foreign key field is null in a one to many relationship (symfony2)
body: <p>I have two tables with an <code>one to many</code> relationship. My code works fine and the form uses interactive mode for adding details, but when I submit it, everything except the <code>foreign key id</code>, which is <code>null</code>, is saved. Therefore the data on the secondary table is not in a relationship with the primary table. Where is the problem?</p>
  
  <p>Here is my primary table (only some attr):</p>
  
  <pre><code>    &lt;?php
  
  namespace Alg\NormasBundle\Entity;
  
  use Doctrine\ORM\Mapping as ORM;
  
  /**
   * Requisitos
   *
   * @ORM\Table()
   * @ORM\Entity(repositoryClass="Alg\NormasBundle\Entity\RequisitosRepository")
   */
  class Requisitos
  {
      /**
       * @var integer
       *
       * @ORM\Column(name="idrequisito", type="integer")
       * @ORM\Id
       * @ORM\GeneratedValue(strategy="AUTO")
       */
      private $id;
  
  
  
      /**
       * @ORM\OneToMany(targetEntity="RequisitosDetalle", mappedBy="requisito", cascade={"persist", "remove"})
       */
      private $detalle;
  
      public function __construct() {
          $this-&gt;detalle = new \Doctrine\Common\Collections\ArrayCollection();
      }
  
      /**
       * Get id
       *
       * @return integer 
       */
      public function getId()
      {
          return $this-&gt;id;
      }
  
  
      /**
       * Add detalle
       *
       * @param \Alg\NormasBundle\Entity\RequisitosDetalle $detalle
       * @return Requisitos
       */
      public function addDetalle(\Alg\NormasBundle\Entity\RequisitosDetalle $detalle)
      {
          $this-&gt;detalle[] = $detalle;
  
          return $this;
      }
  
      /**
       * Remove detalle
       *
       * @param \Alg\NormasBundle\Entity\RequisitosDetalle $detalle
       */
      public function removeDetalle(\Alg\NormasBundle\Entity\RequisitosDetalle $detalle)
      {
          $this-&gt;detalle-&gt;removeElement($detalle);
      }
  
      /**
       * Get detalle
       *
       * @return \Doctrine\Common\Collections\Collection 
       */
      public function getDetalle()
      {
          return $this-&gt;detalle;
      }
  }
  </code></pre>
  
  <p>Here is my secondary table:</p>
  
  <pre><code>    &lt;?php
  
  namespace Alg\NormasBundle\Entity;
  
  use Doctrine\ORM\Mapping as ORM;
  
  /**
   * RequisitosDetalle
   *
   * @ORM\Table()
   * @ORM\Entity(repositoryClass="Alg\NormasBundle\Entity\RequisitosDetalleRepository")
   */
  class RequisitosDetalle
  {
      /**
       * @var integer
       *
       * @ORM\Column(name="iddetalle", type="integer")
       * @ORM\Id
       * @ORM\GeneratedValue(strategy="AUTO")
       */
      private $id;
  
      /**
       * @ORM\ManyToOne(targetEntity="Requisitos", inversedBy="detalle")
       * @ORM\JoinColumn(name="idrequisito", referencedColumnName="idrequisito")
       */
      private $requisito;
  
      /**
       * @var string
       *
       * @ORM\Column(name="tema", type="text")
       */
      private $tema;
  
      /**
       * @var string
       *
       * @ORM\Column(name="disposicion", type="text")
       */
      private $disposicion;
  
      /**
       * @var string
       *
       * @ORM\Column(name="articulos", type="text")
       */
      private $articulos;
  
      /**
       * @var string
       *
       * @ORM\Column(name="aplicacion", type="text", nullable=true)
       */
      private $aplicacion;
  
      /**
       * @var string
       *
       * @ORM\Column(name="evidencia", type="text", nullable=true)
       */
      private $evidencia;
  
      /**
       * @ORM\ManyToOne(targetEntity="Cargos")
       * @ORM\JoinColumn(name="idcargo", referencedColumnName="idcargo")
       */
      private $cargo;
  
  
  
      /**
       * Get id
       *
       * @return integer 
       */
      public function getId()
      {
          return $this-&gt;id;
      }
  
      /**
       * Set tema
       *
       * @param string $tema
       * @return Requisitos
       */
      public function setTema($tema)
      {
          $this-&gt;tema = $tema;
  
          return $this;
      }
  
      /**
       * Get tema
       *
       * @return string 
       */
      public function getTema()
      {
          return $this-&gt;tema;
      }
  
      /**
       * Set disposicion
       *
       * @param string $disposicion
       * @return Requisitos
       */
      public function setDisposicion($disposicion)
      {
          $this-&gt;disposicion = $disposicion;
  
          return $this;
      }
  
      /**
       * Get disposicion
       *
       * @return string 
       */
      public function getDisposicion()
      {
          return $this-&gt;disposicion;
      }
  
      /**
       * Set articulos
       *
       * @param string $articulos
       * @return Requisitos
       */
      public function setArticulos($articulos)
      {
          $this-&gt;articulos = $articulos;
  
          return $this;
      }
  
      /**
       * Get articulos
       *
       * @return string 
       */
      public function getArticulos()
      {
          return $this-&gt;articulos;
      }
  
      /**
       * Set aplicacion
       *
       * @param string $aplicacion
       * @return Requisitos
       */
      public function setAplicacion($aplicacion)
      {
          $this-&gt;aplicacion = $aplicacion;
  
          return $this;
      }
  
      /**
       * Get aplicacion
       *
       * @return string 
       */
      public function getAplicacion()
      {
          return $this-&gt;aplicacion;
      }
  
      /**
       * Set evidencia
       *
       * @param string $evidencia
       * @return Requisitos
       */
      public function setEvidencia($evidencia)
      {
          $this-&gt;evidencia = $evidencia;
  
          return $this;
      }
  
      /**
       * Get evidencia
       *
       * @return string 
       */
      public function getEvidencia()
      {
          return $this-&gt;evidencia;
      }
  
      public function addRequisito(\Alg\NormasBundle\Entity\Requisitos $requisito)
      {
          if (!$this-&gt;requisito-&gt;contains($requisito)) {
              $this-&gt;requisito-&gt;add($requisito);
          }
      }
  
      /**
       * Set requisito
       *
       * @param \Alg\NormasBundle\Entity\Requisitos $requisito
       * @return Requisitos
       */
      public function setRequisito(\Alg\NormasBundle\Entity\Requisitos $requisito = null)
      {
          $this-&gt;requisito = $requisito;
  
          return $this;
      }
  
      /**
       * Get requisito
       *
       * @return \Alg\NormasBundle\Entity\Requisitos 
       */
      public function getRequisito()
      {
          return $this-&gt;requisito;
      }
  
  
  
      /**
       * Set cargo
       *
       * @param \Alg\NormasBundle\Entity\Cargos $cargo
       * @return Requisitos
       */
      public function setCargo(\Alg\NormasBundle\Entity\Cargos $cargo = null)
      {
          $this-&gt;cargo = $cargo;
  
          return $this;
      }
  
      /**
       * Get cargo
       *
       * @return \Alg\NormasBundle\Entity\Cargos 
       */
      public function getCargo()
      {
          return $this-&gt;cargo;
      }
  }
  </code></pre>
  
  <p>form type of the secondary table:</p>
  
  <pre><code>    &lt;?php
  
  namespace Alg\NormasBundle\Form\Type;
  
  use Symfony\Component\Form\AbstractType;
  use Symfony\Component\Form\FormBuilderInterface;
  use Symfony\Component\OptionsResolver\OptionsResolverInterface;
  //use Doctrine\ORM\EntityRepository;
  
  class abmRequisitoDetalleType extends AbstractType
  {
  
      public function buildForm(FormBuilderInterface $builder, array $options)
      {
  
          $builder-&gt;add('tema', null, array('label' =&gt; 'Tema:'))
                  -&gt;add('disposicion', null, array('label' =&gt; 'Disposición:'))
                  -&gt;add('articulos', null, array('label' =&gt; 'Artículos:'));
                  //-&gt;add('aplicacion', null, array('label' =&gt; 'Aplicación:'))
                  //-&gt;add('evidencia', null, array('label' =&gt; 'Evidencia:'));
          //  -&gt;add('cargo', 'entity', array('label' =&gt; 'Disposición:'));
  
      }
  
      public function setDefaultOptions(OptionsResolverInterface $resolver)
      {
          $resolver-&gt;setDefaults(array(
              'data_class' =&gt; 'Alg\NormasBundle\Entity\RequisitosDetalle'
          ));
      }
  
      public function getName()
      {
          return 'fdetalle';
      }
  }
  </code></pre>
  
  <p>form type of the primary table:</p>
  
  <pre><code>    &lt;?php
  
  namespace Alg\NormasBundle\Form\Type;
  
  use Symfony\Component\Form\AbstractType;
  use Symfony\Component\Form\FormBuilderInterface;
  use Symfony\Component\OptionsResolver\OptionsResolverInterface;
  use Alg\NormasBundle\Form\Type\abmRequisitoDetalleType;
  
  class abmRequisitoType extends AbstractType
  {
  
  
      public function buildForm(FormBuilderInterface $builder, array $options)
      {
          $builder-&gt;add('fecha', null, array('label' =&gt; 'Fecha Redacción:',
                                                  'widget' =&gt; 'single_text'))
                  -&gt;add('titulo', null, array('label' =&gt; 'Título Documento:'));
  
          $builder-&gt;add('detalle', 'collection', array(
                                  'type'           =&gt; new abmRequisitoDetalleType(),
                                  'label'          =&gt; 'Detalle de Requisitos Legales:',
                                  'by_reference'   =&gt; false,
                                  'allow_delete'   =&gt; true,
                                  'allow_add'      =&gt; true,
                                  'attr'           =&gt; array('class' =&gt; 'elDetalle')
                      )   );
  
      }
  
      public function setDefaultOptions(OptionsResolverInterface $resolver)
      {
          $resolver-&gt;setDefaults(array(
              'data_class' =&gt; 'Alg\NormasBundle\Entity\Requisitos',
              'cascade_validation' =&gt; true
          ));
      }
  
      public function getName()
      {
          return 'frequisito';
      }
  }
  </code></pre>
  
  <p>The controller:</p>
  
  <pre><code>public function newAction()
  {
      $request = $this-&gt;getRequest();
      $repository = $this-&gt;getDoctrine()-&gt;getManager();
  
          //nuevo
          $requisito = new Requisitos();
          $requisito-&gt;setFecha(new \DateTime('now'));
      $form = $this-&gt;createForm(new abmRequisitoType(), $requisito);
      //-- En caso de que el request haya sido invocado por POST procesaremos el formulario
      if($request-&gt;getMethod() == 'POST')
      {
          //-- Pasamos el request al método bindRequest() del objeto formulario el cual obtiene los datos del formulario
          // y los carga dentro del objeto fhallazgo1 que está contenido también dentro del objeto Type
          $form-&gt;bindRequest($request);
          //-- Con esto nuestro formulario ya es capaz de decirnos si los datos son válidos o no 
          if($form-&gt;isValid())
          {
              $requisito-&gt;setEstado('1');
              $repository-&gt;persist($requisito);
              $repository-&gt;flush();
  
              return $this-&gt;redirect($this-&gt;generateURL('alg_normas_requisitoelab'));
          }
      }
      // Ingresamos al formulario
      return $this-&gt;render('AlgNormasBundle:Requisitos:new.html.twig', 
                              array('form' =&gt; $form-&gt;createView(), 
                                  'requisito' =&gt; $requisito ));
  }
  </code></pre>