我有兩個表格,one to many
關係。我的代碼工作正常,表單使用交互模式添加詳細信息,但是當我提交時,除foreign key id
(null
)之外的所有內容均已保存。因此,輔助表上的數據與主表不存在關係。哪裏有問題?外鍵字段在一對多關係中爲null(symfony2)
這是我的主表(僅一些ATTR):
<?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->detalle = new \Doctrine\Common\Collections\ArrayCollection();
}
/**
* Get id
*
* @return integer
*/
public function getId()
{
return $this->id;
}
/**
* Add detalle
*
* @param \Alg\NormasBundle\Entity\RequisitosDetalle $detalle
* @return Requisitos
*/
public function addDetalle(\Alg\NormasBundle\Entity\RequisitosDetalle $detalle)
{
$this->detalle[] = $detalle;
return $this;
}
/**
* Remove detalle
*
* @param \Alg\NormasBundle\Entity\RequisitosDetalle $detalle
*/
public function removeDetalle(\Alg\NormasBundle\Entity\RequisitosDetalle $detalle)
{
$this->detalle->removeElement($detalle);
}
/**
* Get detalle
*
* @return \Doctrine\Common\Collections\Collection
*/
public function getDetalle()
{
return $this->detalle;
}
}
這是我的輔助表:
<?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->id;
}
/**
* Set tema
*
* @param string $tema
* @return Requisitos
*/
public function setTema($tema)
{
$this->tema = $tema;
return $this;
}
/**
* Get tema
*
* @return string
*/
public function getTema()
{
return $this->tema;
}
/**
* Set disposicion
*
* @param string $disposicion
* @return Requisitos
*/
public function setDisposicion($disposicion)
{
$this->disposicion = $disposicion;
return $this;
}
/**
* Get disposicion
*
* @return string
*/
public function getDisposicion()
{
return $this->disposicion;
}
/**
* Set articulos
*
* @param string $articulos
* @return Requisitos
*/
public function setArticulos($articulos)
{
$this->articulos = $articulos;
return $this;
}
/**
* Get articulos
*
* @return string
*/
public function getArticulos()
{
return $this->articulos;
}
/**
* Set aplicacion
*
* @param string $aplicacion
* @return Requisitos
*/
public function setAplicacion($aplicacion)
{
$this->aplicacion = $aplicacion;
return $this;
}
/**
* Get aplicacion
*
* @return string
*/
public function getAplicacion()
{
return $this->aplicacion;
}
/**
* Set evidencia
*
* @param string $evidencia
* @return Requisitos
*/
public function setEvidencia($evidencia)
{
$this->evidencia = $evidencia;
return $this;
}
/**
* Get evidencia
*
* @return string
*/
public function getEvidencia()
{
return $this->evidencia;
}
public function addRequisito(\Alg\NormasBundle\Entity\Requisitos $requisito)
{
if (!$this->requisito->contains($requisito)) {
$this->requisito->add($requisito);
}
}
/**
* Set requisito
*
* @param \Alg\NormasBundle\Entity\Requisitos $requisito
* @return Requisitos
*/
public function setRequisito(\Alg\NormasBundle\Entity\Requisitos $requisito = null)
{
$this->requisito = $requisito;
return $this;
}
/**
* Get requisito
*
* @return \Alg\NormasBundle\Entity\Requisitos
*/
public function getRequisito()
{
return $this->requisito;
}
/**
* Set cargo
*
* @param \Alg\NormasBundle\Entity\Cargos $cargo
* @return Requisitos
*/
public function setCargo(\Alg\NormasBundle\Entity\Cargos $cargo = null)
{
$this->cargo = $cargo;
return $this;
}
/**
* Get cargo
*
* @return \Alg\NormasBundle\Entity\Cargos
*/
public function getCargo()
{
return $this->cargo;
}
}
形式類型的輔助表的:
<?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->add('tema', null, array('label' => 'Tema:'))
->add('disposicion', null, array('label' => 'Disposición:'))
->add('articulos', null, array('label' => 'Artículos:'));
//->add('aplicacion', null, array('label' => 'Aplicación:'))
//->add('evidencia', null, array('label' => 'Evidencia:'));
// ->add('cargo', 'entity', array('label' => 'Disposición:'));
}
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'Alg\NormasBundle\Entity\RequisitosDetalle'
));
}
public function getName()
{
return 'fdetalle';
}
}
形式主表類型:
<?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->add('fecha', null, array('label' => 'Fecha Redacción:',
'widget' => 'single_text'))
->add('titulo', null, array('label' => 'Título Documento:'));
$builder->add('detalle', 'collection', array(
'type' => new abmRequisitoDetalleType(),
'label' => 'Detalle de Requisitos Legales:',
'by_reference' => false,
'allow_delete' => true,
'allow_add' => true,
'attr' => array('class' => 'elDetalle')
) );
}
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'Alg\NormasBundle\Entity\Requisitos',
'cascade_validation' => true
));
}
public function getName()
{
return 'frequisito';
}
}
控制器:
public function newAction()
{
$request = $this->getRequest();
$repository = $this->getDoctrine()->getManager();
//nuevo
$requisito = new Requisitos();
$requisito->setFecha(new \DateTime('now'));
$form = $this->createForm(new abmRequisitoType(), $requisito);
//-- En caso de que el request haya sido invocado por POST procesaremos el formulario
if($request->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->bindRequest($request);
//-- Con esto nuestro formulario ya es capaz de decirnos si los datos son válidos o no
if($form->isValid())
{
$requisito->setEstado('1');
$repository->persist($requisito);
$repository->flush();
return $this->redirect($this->generateURL('alg_normas_requisitoelab'));
}
}
// Ingresamos al formulario
return $this->render('AlgNormasBundle:Requisitos:new.html.twig',
array('form' => $form->createView(),
'requisito' => $requisito));
}
的工作,謝謝! – vixstor