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']); 为什么你同时拥有region
和region_id
?那是没有意义的。我建议删除 regionId
并依赖对象而不是标识符...
我删除它,但仍然无法正常工作.. 并得到 NULL
【参考方案1】:
正如另一条评论中提到的,在您的实体中同时具有 region 和 regionId 属性是错误的。它完全打破了 Doctrine2 ORM 抽象,很可能是您问题的根源。此外,您还创建了一个映射到整数的实体表单字段。有关我建议的更改,请参见下文。我已将表单的属性映射从regionId
更改为region
,并从Municipality
实体中完全删除了regionId
属性。如果您迫切需要访问 regionId,您可以使用$municipality->getRegion()->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”参数