首页 > 解决方案 > Phalcon\Forms\Form 将 emtpy 字段绑定为 null

问题描述

我有像这里的数据库表

CREATE TABLE `tbl` (
  `id` INT NOT NULL AUTO_INCREMENT,
  `myVar` INT NULL DEFAULT NULL,
  PRIMARY KEY (`id`));

我想将 $_POST 中的空值保存为 NULL。

这是简单的代码:

class MyForm
{
// ...
    public function addInput()
    {
        $t = new Phalcon\Forms\Element\Text('myVar');
        $t->setFilters(['int']);
        // ...
        $this->add($t);
        return $this;
    }
}
class MyController
{
    public function myFunAction()
    {
        $form = new MyForm();
        $entity = new MyModel();
        if ($this->request->isPost() === true) {
            $post = $this->request->getPost();
            if ($form->isValid($post, $entity) === true && $entity->save()) {
                // OK
            }
        }
    }
}

myVar在文本输入中为空字符串时,我在 db 表中有0 。

存储NULL是否比在 myForm 类中覆盖绑定方法更好?

标签: phpdatabasephalcon

解决方案


来自 phalcon的int过滤器会删除除数字、加号和减号之外的所有字符。

此过滤器在内部基于 PHP 的filter_var函数。因此,如果我们使用filter_var,这就是我们如何编写一个返回默认值null的过滤器,如果过滤器失败

<?php

function filter($input) {
    $options = array(
        'options' => array(
            'default' => NULL, // value to return if the filter fails
        ),
    );

    return filter_var($input, FILTER_VALIDATE_INT, $options);
}

var_dump(filter(1)); // Prints 1
var_dump(filter("1")); // Prints 1
var_dump(filter(0)); // Prints 0
var_dump(filter("")); // Prints NULL

但是 Phalcon 不允许您发送所有filter_var实际支持的参数。所以解决这个问题的正确方法实现你自己的过滤器并将代码放在上面。

但是如果你觉得懒惰,解决这个问题的懒惰方法是以正确的方式实现,只需在保存到数据库之前使用此代码即可。

$input = $input === "" ? null : (int) $input;

但是,我建议您通过实施以正确的方式进行操作,Phalcon\FilterInterface因为它可以重复使用。


推荐阅读