当前位置: 首页 > 知识库问答 >
问题:

Cake PHP复杂查找'OR'不能正常工作,空字符串和空字符串

越琦
2023-03-14

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',但很难从当前阶段更改类型。

如何纠正?

共有3个答案

邴俊民
2023-03-14

Cake的空比较似乎取决于数据库字段类型。如果你的字段是整数类型,那么蛋糕将重新定义“为空”。Varchars不会被重新定义。

你能转到MySQL并将Person.image类型更改为varchar吗?

如果是这样,记得清除app/tmp/cache/models中的缓存,以便Cake注册更改。

更新:手动更改模式类型将强制蛋糕处理定义的字段类型。因此,类似这样的查询之前将工作:

$this->Person->_schema['image']['type']='string';
薛云瀚
2023-03-14

也许解释'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' => '')),
        )
    )
);

万志专
2023-03-14

您不必使用关联数组来定义条件。您可以这样定义它:

$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中进行说明… 问题答案: 空字符串无处不在,无处不在。它始终存在于所有弦乐中,渗透着它