举杯邀月

yii2框架查询方法 andFilterWhere 踩过的坑

摘要:yii2框架已经用了很长时间了,查询使用的`andWhere`、`andFilterWhere`也用了很多次了,但是今天就给掉坑里了,其实也不能怪谁,只是自己没有好好看文档。

yii2框架已经用了很长时间了,查询使用的andWhereandFilterWhere也用了很多次了,但是今天就给掉坑里了,其实也不能怪谁,只是自己没有好好看文档。

今天在项目中使用andFilterWhere时,对内容进行了一个判断,数组不包含的给成了个false,语句类似:

public function search($info=[])
{
     $user_id = isset($info['id']) && empty($info['id']) ? $info['id'] : false;
     $result = User::find()->andFilterWhere(['user_id'=>$user_id])->one();
}
1
2
3
4
5
1
2
3
4
5
1
2
3
4
5
1
2
3
4
5

因为这个方法是修改的,当时改完只测试了一下传递id参数的情况,没有问题,但是上线后就出现了问题,不传递参数的也查询不出来了,然后就开始找问题打印sql,一看sql就崩溃了:

select * from user where user_id=false
1
1
1
1

false、false、false,我的印象里为假的参数andFilterWhere都会过滤掉啊,然后就开始找文档,找了半天终于找到了文档上的解释:

andFilterWhere方法里的判断走的是isEmpty() 方法,这个方法的解释是

Returns a value indicating whether the give value is "empty".

The value is considered "empty", if one of the following conditions is satisfied:

it is null,
an empty string (''),
a string containing only whitespace characters,
or an empty array.
1
2
3
4
5
6
7
8
1
2
3
4
5
6
7
8
1
2
3
4
5
6
7
8
1
2
3
4
5
6
7
8

方法:

protected function isEmpty($value)
    {
        return $value === '' || $value === [] || $value === null || is_string($value) && trim($value) === '';
    }
1
2
3
4
1
2
3
4
1
2
3
4
1
2
3
4

人家过滤的只有:null 、空数组、空字符串,就没有false和0。。。。

作者:举杯邀月

出处: http://www.hug-code.cn/archives/5fc0b2ca4f839.html

2020-04-16 标签: yii2