CakePHP - 当某些字段为空时,防止模型数据保存在 saveMany 调用中

Posted

技术标签:

【中文标题】CakePHP - 当某些字段为空时,防止模型数据保存在 saveMany 调用中【英文标题】:CakePHP - Prevent model data being save in a saveMany call when certain fields are blank 【发布时间】:2012-04-17 08:05:34 【问题描述】:

我有一个场景,通过 Cakephp 2.x 中的 saveAll 传递方法,我从一个表单中保存了 3 个不同的模型数据

表格上的模型是:

    项目 项目图像 项目附件

1 和 2 保存得很好,但是 ProjectAttachment 字段有问题。如果你看下图,有问题的字段在右下角,用红框突出显示:http://img.skitch.com/20120417-bnarwihc9mqm1b49cjy2bp13cf.jpg

情况如下:

我已将字段命名如下:*ProjectAttachment.0.project_id*、ProjectAttachment.0.name .... *ProjectAttachment.6.project_id* 等,其中的数字与已经存在用户添加的附件数量,因为没有限制。因此,如果用户已经添加了 6 个文档,则该字段将被称为 ProjectAttachment.7.id 等等。这是因为使用 saveAll 方法时的命名约定。

我使用了两个隐藏字段,一个用于存储用户 ID,另一个用于存储项目 ID。

问题是如果用户没有填写Document Title并选择一个文件上传,表单会失败!如果我删除所有验证规则,表单将不再失败,但会插入空白 ProjectAttachment 记录。

我怀疑问题也可能是 project_id 和 user_id 字段(隐藏的)已经有值了?

我想了想,想出了一个简单的概念:在我的控制器中,在调用 saveAll 之前,我会检查是否提交了空白的 Document Title 字段,如果是,我将完全消除相关的$this->request->data['ProjectAttachment'] 数组中的数组条目,但这似乎不起作用。

为了澄清,我不是在寻找验证规则。如果用户决定他们只想上传图像而不是触摸 ProjectAttachment 表单,那么 saveAll 操作一定不能失败,如果可能的话,它必须简单地不要尝试保存表单中的空白字段。

有什么建议吗?

亲切的问候, 西蒙

【问题讨论】:

【参考方案1】:

看来解决方案比我最初想象的要简单得多!我部分正确,如果遇到任何空白字段,我必须取消设置 $this->request->data 数组中的变量 ProjectArray 键。

我是这样做的:

    if(!empty($this->request->data['ProjectAttachment']))
        foreach($this->request->data['ProjectAttachment'] as $key => $value)
            if(is_array($value) && array_key_exists('upload_file', $value))
                if($value['upload_file']['name'] == '') // Blank document file
                    unset($this->request->data['ProjectAttachment']);
                
            
        
    

我希望有人发现这在某种程度上有用。

亲切的问候, 西蒙

【讨论】:

以上是关于CakePHP - 当某些字段为空时,防止模型数据保存在 saveMany 调用中的主要内容,如果未能解决你的问题,请参考以下文章

当数据表为空时,我们如何禁用数据表导出按钮(或防止点击事件)?

yii2唯一验证器仅当字段不为空时

当某些数据集可能为空时制作图例

两表关联查询,当关联字段数据为空时怎么处理

Cakephp - 条件保存

当字段不为空时,需要Codeigniter验证显示事件