我正在使用Symfony2 + Doctrine 2
在动态表单的验证中给出了这个错误并且不明白为什么。我将一个或多个'conocimiento'(标签)添加到“Recurso”类时才会出错
我在这里介绍相应的课程
class Recurso
{
...
/**
* @var TheWire\PersonaBundle\Entity\Rec_Conocimiento $conocimiento
*,
* @ORM\OneToMany(targetEntity="TheWire\PersonaBundle\Entity\Rec_Conocimiento", mappedBy="recurso", cascade={"all"}, orphanRemoval="true")
*/
private $conocimiento;
...
public function __construct() {
$this->conocimiento = new \Doctrine\Common\Collections\ArrayCollection();
}
....
/**
* Set conocimiento
*
* @param \TheWire\PersonaBundle\Entity\Rec_Conocimiento $conocimiento
*/
public function setConocimiento($conocimiento)
{
$this->conocimiento = $conocimiento;
foreach ($conocimiento as $con){
$con->setRecurso($this);
}
}
/**
* Get conocimiento
*
* @return \Doctrine\Common\Collections\ArrayCollection
*/
public function getConocimiento()
{
return $this->conocimiento;
}
.....
和
class Rec_Conocimiento
{
/**
* @var integer $id
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
*
* @ORM\id
* @ORM\ManyToOne(targetEntity="TheWire\PersonaBundle\Entity\Recurso", inversedBy="conocimiento")
* @ORM\JoinColumn(name="recurso_id", referencedColumnName="id")
*/
private $recurso;
/**
* @var string $conocimiento
* @ORM\Id
* @ORM\ManyToOne(targetEntity="TheWire\PersonaBundle\Entity\Conocimiento")
*/
private $conocimiento;
/**
* @var smallint $nivel
*
* @ORM\Column(name="nivel", type="smallint")
*/
private $nivel;
/**
* Get id
*
* @return integer
*/
public function getId()
{
return $this->id;
}
/**
* Set recurso
*
* @param \TheWire\PersonaBundle\Entity\Recurso $recurso
*/
public function setRecurso(\TheWire\PersonaBundle\Entity\Recurso $recurso)
{
$this->recurso = $recurso;
}
/**
* Get recurso
*
* @return \TheWire\PersonaBundle\Entity\Recurso
*/
public function getRecurso()
{
return $this->recurso;
}
/**
* Set conocimiento
*
* @param string $conocimiento
*/
public function setConocimiento(\TheWire\PersonaBundle\Entity\Conocimiento $conocimiento)
{
$this->conocimiento = $conocimiento;
}
/**
* Get conocimiento
*
* @return string
*/
public function getConocimiento()
{
return $this->conocimiento;
}
/**
* Set nivel
*
* @param smallint $nivel
*/
public function setNivel($nivel)
{
$this->nivel = $nivel;
}
/**
* Get nivel
*
* @return smallint
*/
public function getNivel()
{
return $this->nivel;
}
...
类TheWire \ PersonaBundle \ Entity \ Conocimiento只有$ id和$ name(标签)
我创建了表单:
class RecursoAddType extends AbstractType
{
public function buildForm(FormBuilder $builder, array $options)
{
$builder
->add('conocimiento', 'collection', array(
'required' => false,
'type' => new ConocimientoAddType(),
'allow_add' => true,
'allow_delete' => true,
'prototype' => true,
// Post update
'by_reference' => false,
))
;
}
和
class ConocimientoAddType extends AbstractType
{
public function buildForm(FormBuilder $builder, array $options)
{
$builder
->add('conocimiento', 'entity', array(
'required' => false,
'class' => 'TheWire\\PersonaBundle\\Entity\\Conocimiento',
'empty_value' => 'Selecciona un conocimiento',
'multiple' => false,
'query_builder' => function(EntityRepository $repositorio) {
return $repositorio->createQueryBuilder('con')->leftjoin('con.bloque', 'bloque')
->orderBy('bloque.descripcion, con.descripcion');
},
))
->add('nivel', null,array('required' => false, 'label' => 'Nivel: '))
;
}
我在控制器中正常创建,在db中有一个实体并传递给Twig
$recurso = $em->getRepository('PersonaBundle:Recurso')->findOneBy(array('id' => $id));
$formularioEditarRecurso = $this->createForm(new RecursoAddType(), $recurso);
我显示表单并使用jquery动态添加更多字段
<script type="text/javascript">
$(document).ready(function()
{
function add()
{
var collectionHolder = $('#thewire_personabundle_recursoaddtype_conocimiento');
var prototype = collectionHolder.attr('data-prototype');
form = prototype.replace(/\$\$name\$\$/g, collectionHolder.children().length);
collectionHolder.append(form);
}
$(".record_actions").delegate("a.jslink", "click", function(event){
event.preventDefault();
add();
});
});
</script>
有效表格时:
if ($request->getMethod() == 'POST') {
$formularioEditarRecurso->bindRequest($request);
if ($formularioEditarRecurso->isValid()) {
$em->persist($recurso);
$em->flush();
return $this->redirect($this->generateUrl('AdminPeticionVer', array('id' => $recurso->getPeticion()->getId())));
}
}
获取错误:
SQLSTATE [HY093]:参数号无效:绑定变量数 与令牌数量不匹配
我想这个错误是发送更多标签
如何防止此错误? 感谢