You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用findall()获取数据库所有非NULL值?代码修正求助

解决获取数据库非NULL值的查询问题

嘿,我一眼就看出你这段Yii查询代码的问题啦——你的where条件写法完全不符合框架语法,导致过滤规则根本没生效,所以才会返回全部数据。

问题根源

原代码里的where($fkBez != NULL, [$fkBez => NULL])是错误的写法:Yii的查询构建器要求where的第一个参数是有效的条件模板(字符串或数组格式),第二个参数是绑定参数,但你直接把PHP的比较表达式丢进去了,这会让查询构建器无法正确解析过滤逻辑,最终执行的是不带WHERE条件的全表查询。

正确的写法

这里给你几种可靠的实现方式,都能精准筛选出指定字段不为NULL的记录:

方式1:数组格式的NOT条件(推荐,安全防注入)

public function FindAllGeoData($fkBez) { 
    $ArrayOfFk = array(); 
    $fk = EKontakt::find()
        ->where(["not", [$fkBez => null]])
        ->asArray()
        ->all(); 
    var_dump($fk); 
    die(); 
}

这种写法是Yii官方推荐的参数绑定方式,既能清晰表达“字段不为NULL”的逻辑,又能有效避免SQL注入风险。

方式2:原生SQL字符串条件

如果你更习惯原生SQL的写法,也可以这样写(注意要确保$fkBez是安全的字段名,避免注入风险):

public function FindAllGeoData($fkBez) { 
    $ArrayOfFk = array(); 
    $fk = EKontakt::find()
        ->where("$fkBez IS NOT NULL")
        ->asArray()
        ->all(); 
    var_dump($fk); 
    die(); 
}

方式3:使用notNull()快捷语法

Yii还提供了更直观的快捷方法来实现相同逻辑:

public function FindAllGeoData($fkBez) { 
    $ArrayOfFk = array(); 
    $fk = EKontakt::find()
        ->andWhere(['not', [$fkBez => null]])
        ->asArray()
        ->all(); 
    var_dump($fk); 
    die(); 
}

验证效果

修改后执行代码,var_dump输出的就只会是$fkBez字段不为NULL的记录了。

内容的提问来源于stack exchange,提问作者tklustig

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 04:02:07