2017-04-25 17:26:42 3024次浏览 3条回答 0 悬赏 10 金钱

$query_ol = Orderlist::find()->where([

                                'status' => Orderlist::STATUS_ACTIVE,
                                'phone' => \Yii::$app->user->identity->username,
                                ]);
    $query_ol->andWhere(['<', 'addtime', time()]);
    $query_ol->andWhere(['>=', 'addtime', ':addtime1']); 
    if($query_ol->andWhere([':addtime1'=>strtotime("-1 month")])->count()>=4){
           echo 'hello';
    }

报错提示如下:
Database Exception – yii\db\Exception

SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens
The SQL being executed was: SELECT COUNT(*) FROM so_orderlist WHERE (((status='1') AND (phone='18663697137')) AND (addtime < 1493111483)) AND (addtime >= ':addtime1')
Error Info: Array
(

[0] => HY093
[1] => 0

)

补充于 2017-04-26 08:23


之所以采用参数绑定的方式,是因为下面还有else if 其他情况
else if($query_ol->andWhere([':addtime1'=>strtotime("-1 week")])->count()>=4){

       echo 'in week';
}

如果不采用参数绑定的方式,最终的and会变成这样: and addtime>=xxxx and addtime>=yyyy
仍然非常感谢

补充于 2017-04-26 09:13

SELECT * FROM so_orderlist WHERE ((((status=:qp0) AND (phone=:qp1)) AND (addtime < :qp2)) AND (addtime >= :qp3)) AND (:addtime1=:qp4)

补充于 2017-04-26 09:33

解决了,非常感谢朋友的热心回答

    $query_ol->andWhere(['>=', 'addtime', ':addtime1']); 
    if($query_ol->andWhere([':addtime1'=>strtotime("-1 month")])->count()>=4){
           echo 'hello';
    }

应为:

    $query_ol->andWhere('addtime>=:addtime1'); 
    if($query_ol->params([':addtime1'=>strtotime("-1 month")])->count()>=4){
           echo 'hello';
    }

最佳答案

  • 回答于 2017-04-25 17:33 举报
        $query_ol = Orderlist::find()->where(['status' => Orderlist::STATUS_ACTIVE,'phone' => \Yii::$app->user->identity->username,]);
    
        $query_ol->andWhere(['<', 'addtime', time()]);
        $query_ol->andWhere(['>=', 'addtime', strtotime("-1 month")]); 
        if($query_ol->count()>=4){
               echo 'hello';
        }
    
  • 回答于 2017-04-26 10:45 举报

    多加一句,我记得andwhere是可以加params, 可以用下面2种方法,简化一行代码。

    $query_ol->andWhere('addtime>=:addtime1', [':addtime1'=>strtotime("-1 month")]);

    $query_ol->andWhere(['>=', 'addtime', strtotime("-1 month")]);

您需要登录后才可以回答。登录 | 立即注册
findinset
助理

findinset

注册时间:2017-04-25
最后登录:2018-08-07
在线时长:12小时10分
  • 粉丝0
  • 金钱35
  • 威望0
  • 积分155

热门问题