我在编辑相册"SQLSTATE[23000]:完整性约束冲突:1048列'artist'不能为空"中得到PDOException。我调试了代码,发现在编辑表单操作运行后,所有列(id,title,artist)值都更改为插入语句中的空值,而它应该是编辑表单的 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,
);
}
根据 ZF2 的例子,不应该是
$this->getAlbumTable()->saveAlbum($album);
而不是
$this->getAlbumTable()->saveAlbum($form->getData());
因为您已经绑定了将模型附加到窗体的$album。这基本上做了两件事
- 显示从该相册获取的具有唯一 ID 的初始值
- 验证表单后,数据将放回模型中。
试试我的建议
也许您在创建要绑定到 Form 对象的实体(模型对象)时遇到了与我相同的问题。
我犯的错误是我总是从实体的方法中提供输入过滤器的新实例
getInputFilter();
而在调用$form->isValid()
之后,Zend Form实际上是在看是否有绑定到它的实体对象......如果是这样,那么它将在窗体的 $this->bindValues()
方法中调用 $entity->getInputFilter()
,并在收到 Filter 对象后,代码将返回 $filter->getValues()
以填充绑定模型。由于实体始终返回新的 InputFilter 实例,因此值自然为空/空。
对我来说,错误是在实体(模型)中写了这样的东西:
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 美分,希望尽可能以某种方式提供帮助。