【问题标题】:CakePHP 3.x: Query to exclude records in which a field can be either NULL or empty ('')CakePHP 3.x:查询以排除字段可以为 NULL 或空 ('') 的记录
【发布时间】:2015-12-10 11:10:43
【问题描述】:

我正在使用 Cakephp 3 并尝试从具有非空字段的表中获取一些行/记录。

例如:-

我有一个 areas 表,其中包含一个名为 Area_block 的字段。我需要为那些在Area_block 中包含某些内容的行获取记录。简单来说,我不需要空或 NULL Area_block 行。

Area_block 默认不是 NULL 字段。所以它仍然是empty/blank

我试过了

$conditions = ['Area_Block IS NOT NULL'];
$conditions = ['NOT' => array('Area_Block' => '')];
$conditions = ['Area_Block <>' => ''];
$conditions = ['Area_Block !=' => ''];

但没有任何效果!

我的环境包括 MSSQL server 2008 和 apache 上的 PHP 5.6。

请帮忙!!

【问题讨论】:

    标签: php sql sql-server-2008 cakephp cakephp-3.0


    【解决方案1】:

    我了解您的表中包含Area_Block 设置为NULL''(空字符串)的记录。

    尝试以下方法:

    $conditions = [['Area_Block IS NOT' => null], ['Area_Block IS NOT' => '']];
    

    这也应该有效:

    $conditions = ['Area_Block IS NOT' => [null,'']]; //haven't tested it
    

    但是,为了降低复杂性,您可能希望在数据库中将Area_Block 字段设置为默认为NULL,或默认为'',并阻止该字段接受NULL 值。

    只使用NOT NULL 值可能更容易。如果您更改表格以反映这一点,您只需检查 '' 值:

    $conditions = ['Area_Block IS NOT' => ''];
    

    请参阅 3.x Cookbook 中的 Automatic IS NOT NULL Creation

    【讨论】:

    • 谢谢@Inigo。它完美无缺。我为什么写'Area_Block IS NOT NULL'。我应该尝试更多。 ;)
    • 别担心 :) 在 CakePHP 中使用 NOT NULL 一直很棘手
    • 我认为$conditions = ['Area_Block IS NOT' =&gt; null, 'Area_Block !=' =&gt; '']; 将是要走的路。应该适用于所有记录,与 MySQL 兼容,并且可能比 DATALENGTH 选项更快?
    • @GregSchmidt CakePHP 自动将IS NOT 替换为!=,使其与数据库无关。其他数据库可能需要&lt;&gt;。见en.wikipedia.org/wiki/SQL#Operators
    • @InigoFlores,我必须检查一些 MySQL 和 MS-SQL 应用程序中的各种排列(我不使用任何其他数据库)。我不喜欢'Field IS NOT' =&gt; '',因为当我阅读它时,它并没有很好地映射到我的大脑中;对于值为空的情况,我更愿意留下IS NOT。我认为 Cake 会根据需要将 != 替换为特定于数据库的东西,但我没有任何事实依据。
    【解决方案2】:

    我认为@InigoFlores 提供的解决方案在一定程度上有效,但在某些记录中失败了。

    这是我为使其完美运行所做的工作。

    $conditions = ['DATALENGTH(Area_Block) &gt;' =&gt; 0];

    我希望它对某人有所帮助。

    【讨论】:

    • 我注意到我没有正确阅读您的问题,特别是您提到该字段默认为“”(我假设它是一个字符串)的地方。不幸的是,您提供的解决方案与 MySQL 不兼容。另外,我对您的问题标题提出的编辑建议可能不合适。我将尝试修复问题标题和答案。谢谢!
    • 是的,这个问题只针对 MSSQL,这就是为什么我在所有地方都提到了 MSSQL,包括标签。除了第二个之外,MYSQL 可以用于我在问题中提到的任何解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-24
    • 1970-01-01
    • 2013-10-20
    • 2012-05-22
    相关资源
    最近更新 更多