Cake PHP complex find“OR”运算符在使用null时工作不正常。。。
$conditions = array(
'Person.id' => array(2, 4, 1, 23, 45, 11),
'OR' => array(
array(
array('NOT' => array('Person.image' => null)),
array('NOT' => array('Person.image' => '')),
),
array(
array('NOT' => array('Person.photos' => null)),
array('NOT' => array('Person.photos' => '')),
)
)
);
对应的sql转储输出查询如下所示
SELECT `Person`.`id`, `Person`.`created`, `Person`.`modified`
FROM `people` AS `Person` WHERE `Person`.`id` IN (2, 4, 1, 23, 45, 11) AND
((((NOT (`Person`.`image` IS NULL)) AND (NOT (`Person`.`image` = NULL)))) OR
(((NOT (`Person`.`photos` IS NULL)) AND (NOT (`Person`.`photos` = '')))))
ORDER BY FIELD(`Person`.`id`, 2, 4, 1, 23, 45, 11) ASC LIMIT 3
在cake条件数组中,我给出了Person.image
不是null
或'
,但相应的cake sql输出为(不是(Person.image为null))和(不是(Person.image=null))
,它们应该类似于(不是(Person.image为null))和(不是(Person.image='')
。
这里Person.image
两者都与NULL本身进行比较(即NULL和=NULL),其中Person.image=NULL要与Person.image=''这样的空字符串进行比较。
这里的'Person.image'
是'INT'
和'Person.photos'
是类型的'VARCHAR'
,但很难从当前阶段更改类型。
如何纠正?
Cake的空比较似乎取决于数据库字段类型。如果你的字段是整数类型,那么蛋糕将重新定义“为空”。Varchars不会被重新定义。
你能转到MySQL并将Person.image类型更改为varchar吗?
如果是这样,记得清除app/tmp/cache/models中的缓存,以便Cake注册更改。
更新:手动更改模式类型将强制蛋糕处理定义的字段类型。因此,类似这样的查询之前将工作:
$this->Person->_schema['image']['type']='string';
也许解释'Person.image有问题
从MySQL手册:
您不能使用算术比较运算符,例如=,
您可以尝试用否定的空比较来替换它:
array('NOT' => array('Person.image' => null))
除此之外,最后两个
OR
运算符什么都不做,因为每个运算符中只有一个语句。你的数组嵌套是你想要的吗?如果您添加换行和缩进,您的代码将成为
$conditions = array(
'Person.id' => array(2, 4, 1, 23, 45, 11),
'OR' => array(
array(
'OR' => array(
'Person.image <>' => null
),
array(
'Person.image <>' => ''
)
),
array(
'OR' => array(
'Person.photos <>' => ''
),
array(
'Person.photos <>' => null
)
)
)
);
...看起来很奇怪。
完整的变化将是:
$conditions = array(
'Person.id' => array(2, 4, 1, 23, 45, 11),
'OR' => array(
array(
array('NOT' => array('Person.image' => null)),
array('NOT' => array('Person.image' => '')),
),
array(
array('NOT' => array('Person.photos' => null)),
array('NOT' => array('Person.photos' => '')),
)
)
);
您不必使用关联数组来定义条件。您可以这样定义它:
$conditions = array(
'Person.id' => array(2, 4, 1, 23, 45, 11),
'OR' => array(
array(
array('NOT' => array('Person.image' => null)),
array('NOT' => array('Person.image = "" ')),
),
array(
array('NOT' => array('Person.photos' => null)),
array('NOT' => array('Person.photos = "" ')),
)
)
);
问题内容: 这个问题已经在这里有了答案 : 如何使用Python查找字符串中的重叠序列数?[重复] (4个答案) 4年前关闭。 在“ ababa”中有两次“ aba”出现(第0个索引和第2个索引): 但是这段代码的输出值为:1 我知道这个问题似乎很简单,但是答案不应该是2吗? 如果不是,那么count函数不是真的没有按照预期去做吗? 有没有简单的选择? 问题答案: 来自Python字符串函数文档
我已经做了这个程序,我被卡住了。当我运行它时,我的输入没有使用空格,它工作得很好,例如,在customer input中只输入。但是,当我输入时,它会合并接下来的两个字符串输入方向(如所附的pic所示)。我在这里做错了什么?
问题内容: 基本上,我试图按其名称对表进行排序。该表相对较大,但出于示例目的,我仅发布了一列。列在下方 上面的排序是通过尝试以下操作实现的: 但是,我无法对EPA WELL 108S进行分类。我需要它在EPA WELL 108和EPA WELL 109之间移动,我尝试了许多不同的方法。 EPA之后,电台列表也会继续。 问题答案: 该解决方案比所选答案更可靠。如果站中有超过1个数字(例如“ EPA
问题内容: 空字符串()和空字符串()有什么区别? 这就是我所拥有的: 这是什么意思? 问题答案: 表示将空值分配给。在这种情况下,与相同,将按预期产生。 表示将()或“完全没有值”分配给。因此,这与相同,它将产生一个,因为您无法在Java中对变量(指针或类似物)调用方法。 还有一点,声明 实际上具有与以下功能相同的效果: 鉴于 如前所述,是另一回事。
问题内容: 我想知道上面的代码是否可用于检查变量是否为null或为空。 问题答案: 是的,该代码正是这样做的。 您还可以使用: 编辑: 使用添加的值信息,您需要: 一个值不能包含值。
问题内容: 我很好奇为什么在查询字符串中的空字符串索引时为什么返回0(而不是-1)。 Javadocs仅说此方法返回指定字符串在此字符串中的索引,如果找不到该字符串,则返回-1。 对我来说,这种行为似乎非常出乎意料,我本来希望为-1。有什么想法为什么这种意外行为会继续吗?我至少认为这值得在该方法的Javadocs中进行说明… 问题答案: 空字符串无处不在,无处不在。它始终存在于所有弦乐中,渗透着它