【问题标题】:Entity form gets null value in Symfony2实体表单在 Symfony2 中获取空值
【发布时间】:2016-01-27 12:49:46
【问题描述】:

我想从 Marka entity 中向 Model entity 添加一个选项。 我对选择表单中的数据有疑问。表单里面有所有数据,但是当我发送表单时出现错误:

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;
    }
}

【问题讨论】:

    标签: php symfony orm doctrine-orm


    【解决方案1】:

    您的问题尚不完全清楚,但我知道您想要做的是拥有一个 Model 实体,其中将包含一个 Marka 字段。如果是这种情况,那么首先,您不想将 Marka 存储为模型中的整数,而是希望将其存储为具有(可能)ManyToOne 关系的 Marka 对象:

    /**
     * @ORM\ManyToOne(targetEntity="Marka")
     * @ORM\JoinColumn(name="idm", referencedColumnName="id")
     */
    protected $marka;
    

    Doctrine 将使用整数将这种关系表示为数据库中的整数,使用 idm

    完成此操作后,您可以在 ModelType 表单中使用它,而无需使用 'mapped' =&gt; 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);
    

    【讨论】:

    • 谢谢,现在好了:))))))
    【解决方案2】:

    ->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
    

    Mapped false 意味着不将该属性映射到底层对象,因此它不会被持久化,然后会导致您的数据库错误。

    【讨论】:

    • 不幸的是,没有;/我删除了这一行,现在错误是:An exception occurred while executing 'INSERT INTO model (nazwa, idm) VALUES (?, ?)' with params ["aaa", {}]: Catchable Fatal Error: Object of class UTPBundle\Entity\Marka could not be converted to string
    • 您可能需要为此查看数据转换器:symfony.com/doc/current/cookbook/form/data_transformers.html - 因为您在 marka 和模型之间没有正确的实体关系。理想情况下,您应该遵循以下答案 (Carlos)。
    猜你喜欢
    • 1970-01-01
    • 2013-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-31
    • 1970-01-01
    • 2016-03-08
    • 1970-01-01
    相关资源
    最近更新 更多