实体表单在Symfony2中获取空值

时间:2015-10-27 22:06:51

标签: php symfony orm doctrine-orm

我想从 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;
    }
}

2 个答案:

答案 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表示不将该属性映射到基础对象,因此它不会被持久化,从而导致数据库错误。