我有以下代码:
$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验证了我的表单使用值为false
的POST
提交变量(当然不是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"));
(就我的目的而言)铸件保证产生true
或false
,这就足够了。
如果有人有更好的想法,我愿意接受建议。