Symfony属性查询:使用“;false”;将其设置为“0”;空”;


Symfony Propel Query: setting a non-null value with "false" sets it to "null"

我有以下代码:

$stmt->setFlag($this->form->getValue("flag")); // $this->form->getValue("flag") = "false"

在我的自动生成的Propel类中,它调用以下代码:

1     public function setFlag($v)
2 {
3     if ($v !== null) {
4         if (is_string($v)) {
5             $v = in_array(strtolower($v), array('false', 'off', '-', 'no', 'n', '0', '')) ? false : true;
6         } else {
7             $v = (boolean) $v;
8         }
9     }
10    if ($this->flag !== $v) {
11        $this->flag = $v;
12        $this->modifiedColumns[] = TableNamePeer::FLAG;
13    }
14    return $this;
15 } 

我的标志模式条目如下:

ALTER TABLE tablename ADD COLUMN flag BOOLEAN NOT NULL DEFAULT false;

我的XML条目如下:

<table name="tablename" phpName="TableName">
    ...
    <column name="flag" phpName="Flag" type="BOOLEAN" required="true" defaultValue="false"/>
    ...
</table>

我已经用XDebug验证了我的表单使用值为falsePOST提交变量(当然不是null)。

但是,setFlag函数接收的变量为null函数跳过setFlag函数第3行的if分支,然后在第11行和第12行将flag设置为null。这会在提交到数据库时产生错误,因为字段不能为null。

这是怎么回事?

编辑

有趣的是,如果我给setFlag函数传递一个实际的false值,即$stmt->setFlag(false),那么setFlag就会接收到数据库提交工作的正确值。什么

编辑2:

事实证明,我使用的Bootstrap开关在单击开关/复选框时使用on值,否则使用null值,所以它确实将null传递给了函数,我一定在某个地方出错了。

现在的问题是,当开关没有被点击时,是否可以让它通过false而不是null,或者我是否只需要对该标志进行特殊检查。欢迎对这两种方法提出建议。

没有我喜欢的好的解决方案,所以我最终解决了我的问题:

$stmt->setFlag((bool) $this->form->getValue("flag"));

(就我的目的而言)铸件保证产生truefalse,这就足够了。

如果有人有更好的想法,我愿意接受建议。