我想从 Marka实体中添加模型实体一个选项。 我对选择表格中的数据有疑问。表单中包含所有数据,但是当我发送表单时,我收到错误:
An exception occurred while executing 'INSERT INTO model (nazwa, idm) VALUES (?, ?)' with params ["a", null]:
SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'idm' cannot be null
当我检查源代码时,我看到该值是正确的:
<select id="namefield_idm" name="namefield[idm]" class="form-control">
<option value="1" >Opel</option>
<option value="2" >Mazda</option>
<option value="3" >Ford</option>
</select>
我不知道什么是错的。我的ModelType.php
<?php
namespace UTPBundle\Form;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Doctrine\ORM\EntityRepository;
class ModelType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('nazwa', 'text', array('label' => 'Nazwa', 'attr' => array(
'class' => 'form-control')
))
->add('idm', 'entity', array(
'label' => 'Marka',
'mapped' => false,
'class' => 'UTPBundle:Marka',
'choice_label' => 'nazwa',
'attr' => array(
'class' => 'form-control'
),
'query_builder' => function(EntityRepository $er) {
return $er->createQueryBuilder('u');
},
))
->add('save', 'submit', array('label' => 'Dodaj', 'attr' => array(
'class' => 'btn btn-success'
)));
}
public function configureOptions(OptionsResolver $resolver)
{
}
public function getName()
{
return 'namefield';
}
}
?>
我的控制器代码如下:
/**
* @Route("/model", name="utp_model")
*/
public function modelAction(Request $request)
{
$name = 'Model';
$model = new Model();
$marka = new Marka();
$form = $this->createForm(new ModelType($marka), $model);
$form->handleRequest($request);
if ($form->isValid() && $form->isSubmitted()) {
$em = $this->getDoctrine()->getManager();
$em->persist($model);
$em->flush();
}
return $this->render('UTPBundle:Default:model.html.twig', array(
'name' => $name,
'form' => $form->createView()
));
}
模型实体也是:
<?php
namespace UTPBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
* Model
*
* @ORM\Table()
* @ORM\Entity
*/
class Model
{
/**
* @var integer
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @var string
*
* @ORM\Column(name="nazwa", type="string", length=255)
*/
private $nazwa;
/**
* @var integer
*
* @ORM\Column(name="idm", type="integer")
*/
private $idm;
/**
* Get id
*
* @return integer
*/
public function getId()
{
return $this->id;
}
/**
* Set idm
*
* @param integer $idm
*
* @return Model
*/
public function setIdm($idm)
{
$this->idm = $idm;
return $this;
}
/**
* Get idm
*
* @return string
*/
public function getIdm()
{
return $this->idm;
}
/**
* Set nazwa
*
* @param string $nazwa
*
* @return Model
*/
public function setNazwa($nazwa)
{
$this->nazwa = $nazwa;
return $this;
}
/**
* Get nazwa
*
* @return string
*/
public function getNazwa()
{
return $this->nazwa;
}
}
答案 0 :(得分:1)
您的问题并不完全清楚,但我了解您要做的是拥有一个Model
实体,其中包含Marka
字段。如果是这种情况,那么首先,您不希望将Marka存储为模型中的整数,您希望将其存储为具有(可能)ManyToOne关系的Marka对象:
/**
* @ORM\ManyToOne(targetEntity="Marka")
* @ORM\JoinColumn(name="idm", referencedColumnName="id")
*/
protected $marka;
Doctrine将使用整数来表示此关系在数据库中以整数形式表示,使用idm
列
完成此操作后,您可以在不使用'mapped' => false
的模型类型表单中使用它:
->add('marka', 'entity', array(
'label' => 'Marka',
'class' => 'UTPBundle:Marka',
'choice_label' => 'nazwa',
'attr' => array(
'class' => 'form-control'
),
))
(请注意,您不需要query_builder
选项,因为您的查询构建器只返回所有对象,默认情况下实体字段已经这样做了。)
最后你只需稍微修改你的控制器,因为你现在不需要创建任何Marka
对象:
$model = new Model();
$form = $this->createForm(new ModelType(), $model);
答案 1 :(得分:0)
在
->add('idm', 'entity', array(
'label' => 'Marka',
'mapped' => false,
'class' => 'UTPBundle:Marka',
'choice_label' => 'nazwa',
'attr' => array(
'class' => 'form-control'
),
'query_builder' => function(EntityRepository $er) {
return $er->createQueryBuilder('u');
},
))
删除行
'mapped' => false
映射的false表示不将该属性映射到基础对象,因此它不会被持久化,从而导致数据库错误。