Symfony2 使用参数 ["test message", null] 执行 [...] 时发生异常:

Posted

技术标签:

【中文标题】Symfony2 使用参数 ["test message", null] 执行 [...] 时发生异常:【英文标题】:Symfony2 An exception occurred while executing [...] with params ["test message", null]: 【发布时间】:2014-09-03 16:02:15 【问题描述】:

我对 symfony2 有问题:

使用参数 ["Test message", null] 执行“INSERT INTO Municipality (name, region_id) VALUES (?, ?)”时发生异常: SQLSTATE [23000]:违反完整性约束:1048 列 'region_id' 不能为空

这是我的控制器:

public function createAction(Request $request)


    $entity = new Municipality();

    $form = $this->createCreateForm($entity);
    $form->handleRequest($request);

    $params = $this->getRequest()->request->all();

    if ($form->isValid()) 
        $em = $this->getDoctrine()->getManager();


        //$entity->setRegionId(21);

        $em->persist($entity);
        $em->flush();

        return $this->redirect($this->generateUrl('municipality_show', array('id' => $entity->getId())));
    

    return array(   
        'entity' => $entity,
        'form'   => $form->createView(),
    );

博尔德:

 /**
 * @param FormBuilderInterface $builder
 * @param array $options
 */
public function buildForm(FormBuilderInterface $builder, array $options)


    $builder
        ->add('regionId', 'entity', array('class' => 'CMSSurveyBundle:Region',
            'query_builder' => function(EntityRepository $er)  return $er->createQueryBuilder('a')->orderBy('a.name', 'ASC'); ,
            'attr' => array('control-class' => 'col-lg-6', 'class' => 'form-control'))
        )
        ->add('name')
    ;

实体:

/**
 * @var integer
 *
 * @ORM\Column(name="region_id", type="integer")
 */
private $regionId;

/**
 * @ORM\ManyToOne(targetEntity="Region", inversedBy="municipalities")
 * @ORM\JoinColumn(name="region_id", referencedColumnName="id")
 */

private $region;

$_POST 给控制器:

Array
(
    [CMS_surveybundle_municipality] => Array
        (
            [name] => Test message
            [regionId] => 20
            [_token] => 8628f62dd8d398b85685def1d368334ay1d7a816
        )

)
1 

观看次数:

            <hr/>
        <table>
        <tr>
            <td class="col-lg-4">
                <?php echo $view['form']->label($form['name']); ?>
            </td>
            <td class="col-lg-6">
                <?php echo $view['form']->errors($form['name']); ?>
                <?php echo $view['form']->widget($form['name']); ?>
            </td>
        </tr>
        <tr>
            <td class="col-lg-4">
                <?php echo $view['form']->label($form['regionId']); ?>
            </td>
            <td class="col-lg-6">
                <?php echo $view['form']->errors($form['regionId']); ?>
                <?php echo $view['form']->widget($form['regionId']); ?>
            </td>
        </tr>
        </table>
        <hr/>

【问题讨论】:

取消注释时会发生什么 //$entity->setRegionId(21); ? 没什么。也许问题出在控制器 $entity = new Municipality(); 中的实体对象上。 尝试像这样设置实体对象:$entity->setName($form['name']); $entity->setRegionId($form['regionId']); 为什么你同时拥有regionregion_id?那是没有意义的。我建议删除 regionId 并依赖对象而不是标识符... 我删除它,但仍然无法正常工作.. 并得到 NULL 【参考方案1】:

正如另一条评论中提到的,在您的实体中同时具有 region 和 regionId 属性是错误的。它完全打破了 Doctrine2 ORM 抽象,很可能是您问题的根源。此外,您还创建了一个映射到整数的实体表单字段。有关我建议的更改,请参见下文。我已将表单的属性映射从regionId 更改为region,并从Municipality 实体中完全删除了regionId 属性。如果您迫切需要访问 regionId,您可以使用$municipality-&gt;getRegion()-&gt;getId()

建造者:

 /**
 * @param FormBuilderInterface $builder
 * @param array $options
 */
public function buildForm(FormBuilderInterface $builder, array $options)


    $builder
        ->add('region', 'entity', array('class' => 'CMSSurveyBundle:Region',
            'query_builder' => function(EntityRepository $er)  return $er->createQueryBuilder('a')->orderBy('a.name', 'ASC'); ,
            'attr' => array('control-class' => 'col-lg-6', 'class' => 'form-control'))
        )
        ->add('name')
    ;

实体:

/**
 * @ORM\ManyToOne(targetEntity="Region", inversedBy="municipalities")
 * @ORM\JoinColumn(name="region_id", referencedColumnName="id")
 */

private $region;

【讨论】:

【参考方案2】:

当您删除 regionId 时,您是否真的从表单和模板中清除了它?考虑使用新的 regionId 免费代码更新您的问题。

您还可以查看文档以了解 Doctrine 2 如何处理关系。想要操纵实际的 id 是一个常见的错误。 http://symfony.com/doc/current/book/doctrine.html

目前,您没有任何东西可以将地区与您的自治市联系起来。在您的控制器中,您将需要:

$municipality = new Municipality(); // Used to be called entity.  Rename for clarity
$region = new Region();
$municipality->setRegion($region);

$form = $this->createCreateForm($municipality);

【讨论】:

以上是关于Symfony2 使用参数 ["test message", null] 执行 [...] 时发生异常:的主要内容,如果未能解决你的问题,请参考以下文章

在 Symfony2 Beta3 中不断收到“您请求了一个不存在的服务“test.client””

Symfony2 删除生产中的“if-modified-since”参数

如何访问 Symfony2 中的嵌套参数值?

使用多个参数对对象进行排序 - symfony2

Symfony2 / 路由 / 使用参数作为控制器或动作名称

Symfony2,如何使用 KnpPaginatorBundle 和 QueryBuilder 传递参数排序和方向