php - 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 类中覆盖绑定方法更好?
解决方案
来自 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
因为它可以重复使用。
推荐阅读
- android - 尽管 Gson 转换器从不返回 null,但在一个为 null 的成员变量上出现崩溃:不可能的情况
- javascript - Bootstrap Fullcalendar Modal 用于单个事件
- c# - Base() 和 This() 在构造函数中。(链式构造函数)
- python - 优化这个递归函数(动态规划)
- javascript - “输入”类型范围内的问题,以及用于设计视频播放器的 JavaScript
- apache-kafka-streams - Kafka 流不会重试反序列化错误
- bigcommerce - bigcommerce 隐藏自定义地址字段
- excel - VBA 滚动到顶部(不向左)
- ios - 如何在swiftui中使用选择器内部的切换并根据切换更改选择器值
- php - 未定义的变量:laravel foreach 中的错误