我在使用doctrine和composobject
尝试保存相关数据时遇到了麻烦这些是我的实体
这是我的员工实体
<?php
namespace Nomina\Entity;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\ORM\Mapping as ORM;
use Zend\Form\Annotation;
use Nomina\Entity\EmpleadosDetalles;
/**
* Empleado
*
* @ORM\Table(name="empleado")
* @ORM\Entity
* @Annotation\Hydrator("Zend\Stdlib\Hydrator\ObjectProperty")
* @Annotation\Name("EmpleadoForm")
*/
class Empleado
{
/**
* @var integer
*
* @ORM\Column(name="id", type="integer", nullable=false)
* @ORM\Id
* @ORM\GeneratedValue(strategy="IDENTITY")
*/
private $id;
/**
* @var string
*
* @ORM\Column(name="nombre", type="string", length=255, nullable=false)
* @Annotation\Type("Zend\Form\Element\Text")
* @Annotation\Required({"required":"true"})
* @Annotation\Filter({"name":"StripTags"})
* @Annotation\Options({"label":"Nombre"})
* @Annotation\Attributes({"class":"form-control"})
* @Annotation\Validator({"name":"NotEmpty","options":{"messages":{"isEmpty":"no debe estar vacio"}}})
*/
private $nombre;
/**
* @var \EmpleadosDetalles $detalles
* @ORM\OneToMany(targetEntity="Nomina\Entity\EmpleadosDetalles", mappedBy="empleado", cascade={"persist"})
* @Annotation\ComposedObject("Nomina\Entity\EmpleadosDetalles")
*/
private $detalles;
/**
* @Annotation\Type("Zend\Form\Element\Submit")
* @Annotation\Attributes({"value":"Procesar"})
* @Annotation\Attributes({"class":"btn btn-primary"})
*/
public $submit;
public function __construct() {
$this->detalles = new ArrayCollection();
}
public function getDetalles() {
return $this->detalles;
}
/**
* Set nombre
*
* @param string $nombre
* @return Empleado
*/
public function setNombre($nombre)
{
$this->nombre = $nombre;
return $this;
}
/**
* Get nombre
*
* @return string
*/
public function getNombre()
{
return $this->nombre;
}
}
这是我的详细信息实体,属于员工
<?php
namespace Nomina\Entity;
use Doctrine\ORM\Mapping as ORM;
use Zend\Form\Annotation;
/**
* EmpleadosDetalles
*
* @ORM\Table(name="empleadosDetalles", indexes={@ORM\Index(name="fk_empleado", columns={"idEmpleado"})})
* @ORM\Entity
* @Annotation\Hydrator("Zend\Stdlib\Hydrator\ObjectProperty")
* @Annotation\Name("EmpleadoDetallesForm")
*/
class EmpleadosDetalles
{
/**
* @var integer
*
* @ORM\Column(name="id", type="integer", nullable=false)
* @ORM\Id
* @ORM\GeneratedValue(strategy="IDENTITY")
*/
private $id;
/**
* @var string
*
* @ORM\Column(name="salario", type="int", nullable=false)
* @Annotation\Type("Zend\Form\Element\Text")
* @Annotation\Required({"required":"true"})
* @Annotation\Filter({"name":"StripTags"})
* @Annotation\Options({"label":"Salario"})
* @Annotation\Attributes({"class":"form-control"})
* @Annotation\Validator({"name":"NotEmpty","options":{"messages":{"isEmpty":"no debe estar vacio"}}})
*/
private $salario = '0';
/**
* @var string
*
* @ORM\Column(name="numero", type="string", length=20, nullable=true)
* @Annotation\Type("Zend\Form\Element\Text")
* @Annotation\Required({"required":"true"})
* @Annotation\Filter({"name":"StripTags"})
* @Annotation\Options({"label":"Numero"})
* @Annotation\Attributes({"class":"form-control"})
* @Annotation\Validator({"name":"NotEmpty","options":{"messages":{"isEmpty":"no debe estar vacio"}}})
*/
private $numero;
/**
* @ORM\Column(name="idEmpleado", type="integer", length=11, nullable=false)
*/
private $idEmpleado;
/**
* @ORM\ManyToOne(targetEntity="Nomina\Entity\Empleado", inversedBy="detalles")
* @ORM\JoinColumns({
* @ORM\JoinColumn(name="idEmpleado", referencedColumnName="id")
* })
*/
protected $empleado;
/**
* Set salario
*
* @param integer $salario
* @return EmpleadosDetalles
*/
public function setSalario($salario)
{
$this->salario = $salario;
return $this;
}
/**
* Get salario
*
* @return integer
*/
public function getSalario()
{
return $this->salario;
}
/**
* Set numero
*
* @param string $numero
* @return EmpleadosDetalles
*/
public function setNumero($numero)
{
$this->numero = $numero;
return $this;
}
/**
* Get numero
*
* @return string
*/
public function getNumero()
{
return $this->numero;
}
public function setEmpleado(Empleado $empleado)
{
$this->empleado = $empleado;
return $this;
}
public function getEmpleado()
{
return $this->empleado;
}
}
这是我的控制器动作
public function addAction() {
$view = new ViewModel();
$empleado = new Empleado();
$entityManager = $this->entityManager();
$builder = new DoctrineAnnotationBuilder($entityManager);
$form = $builder->createForm($empleado);
$request = $this->getRequest();
if ($request->isPost()) {
$form->bind($empleado);
$form->setHydrator(new DoctrineHydrator($entityManager,'Nomina\Entity\Empleado'));
$form->setValidationGroup('nombre');
$form->setData($request->getPost());
if ($form->isValid()) {
$entityManager->persist($empleado);
$entityManager->flush();
$this->redirect()->toRoute('empleado');
} else {
$view->messages = $form->getMessages();
}
}
$view->form = $form;
return $view;
}
我没有收到任何错误,该员工已将其保存在表格中,但详细信息表格未填充。我错过了什么?
答案 0 :(得分:0)
可能是你的问题在inputFilter / validator中。你的@annotation验证/过滤有问题,因此inputFilter正在过滤$detalles
的所有数据,这意味着只有一个空数组可以保湿。
首先检查所有数据是否在您的帖子中:
var_dump($request->getPost());
然后尝试水合一次,而不使用表单inputFilter进行过滤/验证。 像这样:
$empleado = new Empleado();
$hydrator = new DoctrineHydrator($entityManager,'Nomina\Entity\Empleado');
$data = $request->getPost()
$empleado = $hydrator($data, $empleado);
$entityManager->persist($empleado);
$entityManager->flush();
检查是否有效。 至少你知道问题是在你的表单验证/过滤中还是在你的实体定义中的其他地方。