2015-12-05 16:30:58 4802次浏览 3条回答 1 悬赏 10 金钱
$query = Equip::find()->andFilterWhere(['and','is_delete',0]);

该字段的值只有0和1。数据库中页确实存在该字段值为0的数据,但是这样写提示没有找到数据,把0改成1能找出该字段值为1的数据。如果不加andFilterWhere语句,那么会正常显示所有的数据,包括is_delete字段为0的数据。

最佳答案

  • 500miles 发布于 2015-12-05 19:58 举报

    先说解决办法, 改成下面的形式 :

    $query = Equip::find()->andFilterWhere(['is_delete' => 0]);
    或者
    $query = Equip::find()->andFilterWhere(['and', ['is_delete' => 0]]);
    

    接下来分析 为什么会出现这么有趣的现象

    is_delete = 1 可以达到预期, 不加这个条件也可以达到预期, 偏偏 is_delete = 0 有问题

    原因是按照你写的那样, 最终生成的sql会是 :

    select * from table where is_delete and 0 (或者1);

    有意思的是, select * from table where fieldName 这样的语句并不会报错.

    我试了下, fieldName 为空, 为null, 为0的时候, 查不到.

    其他时候均能查到, 但是此种情况下, 不会用到索引.

    2 条回复
    回复于 2015-12-05 20:09 回复

    上面说的是针对mysql , 刚又试了下pgsql, 这种语法直接抛错 , 你用的是mysql吧?

    回复于 2015-12-06 16:30 回复

    非常感谢!我用的是mysql。

    觉得很赞
  • 回答于 2015-12-07 17:38 举报

    为什么要andFilterWhere,直接where不行吗?

    1 条回复
    回复于 2015-12-08 22:19 回复

    谢谢你的回答哈,我是纯新人,数据库,PHP和YII都是第一次接触。之前也不知道where,后来我也用了where,只是这个问题让我困扰了而已。

  • 回答于 2016-10-10 17:10 举报

    andFilterWhere这个是有为空判断的,可以看哈源码filterCondition这个方法,用andWhere就可以了

    觉得很赞
您需要登录后才可以回答。登录 | 立即注册
Bearox
试用期

Bearox

注册时间:2015-12-05
最后登录:2016-04-08
在线时长:0小时50分
  • 粉丝0
  • 金钱20
  • 威望0
  • 积分20

热门问题