如何使用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
相关产品推荐
相关产品推荐

