我在编辑相册中遇到PDOException“SQLSTATE [23000]:完整性约束违规:1048列'艺术家'不能为空”。我调试了代码,发现在编辑表单操作运行后,所有列(id,title,artist)值都会更改为insert语句中的null值,而它应该是编辑表单的POST值。我使用与ZF2教程相同的代码。 $ request-> getPost()具有正确的已编辑值,但$ form-> getData()返回(id,title,artist)的空表单后置值。
任何人都可以帮忙。
我的代码是:
public function editAction()
{
$id = (int) $this->params()->fromRoute('id', 0);
if (!$id) {
return $this->redirect()->toRoute('album', array(
'action' => 'add'
));
}
$album = $this->getAlbumTable()->getAlbum($id);
$form = new AlbumForm();
$form->bind($album);
$form->get('submit')->setAttribute('value', 'Edit');
$request = $this->getRequest();
if ($request->isPost()) {
$form->setInputFilter($album->getInputFilter());
$form->setData($request->getPost());
if ($form->isValid()) {
$this->getAlbumTable()->saveAlbum($form->getData());
// Redirect to list of albums
return $this->redirect()->toRoute('album');
}
}
return array(
'id' => $id,
'form' => $form,
);
}
答案 0 :(得分:2)
根据ZF2的例子,不应该是
$this->getAlbumTable()->saveAlbum($album);
而不是
$this->getAlbumTable()->saveAlbum($form->getData());
因为您已经绑定了将模型附加到表单的$ album。这基本上做了两件事
试试我的建议
答案 1 :(得分:2)
也许您遇到了与创建 (模型对象)时绑定到 表单<的问题相同的问题/ em> 对象。
我犯的错误是我总是从实体的方法提供一个新的InputFilter实例
getInputFilter();
在调用$form->isValid()
之后,Zend Form实际上是在查看是否有绑定到它的实体对象......如果是这样,那么它会在表单内调用$entity->getInputFilter()
。 ; s $this->bindValues()
方法,在收到过滤器对象后,代码将返回$filter->getValues()
来填充绑定模型。由于实体始终返回新的 InputFilter 实例,因此值自然为空/ null。
对我来说,错误是在实体(模型)中写了这样的东西:
public function getInputFilter()
{
return new SomeInputFilter();
}
但实际上,我需要编写这样的方法:
public function getInputFilter()
{
if(empty($this->inputFilter)){
$this->inputFilter = new SomeInputFilter();
}
return $this->inputFilter;
}
正如您所看到的,解决方案是设置受保护的属性$inputFilter
,并仅在InputFilter
对象的新实例为空时填充它。在编写代码时没有彻底关注文档,并且在尝试插入记录时遇到了与您一样的问题(绑定模型中的空数据)。
希望你会发现这很有用,但如果没有,我很抱歉浪费你的时间阅读这篇文章。 :)
PS:感谢您阅读我的回答,我知道我对该主题的回答有点迟,但我最近开始使用Zend 2 Framework,我遇到了类似的问题,所以我试图分享我的2美分,希望尽可能以某种方式帮助。