phpluo 2017-07-25 16:36:54 73441次浏览 4条评论 21 1 0

官方文档:http://www.yiichina.com/doc/guide/2.0/db-query-builder

文章涉及where、 addParams 、filterWhere 、andWhere、orWhere、 andFilterWhere()、 orFilterWhere()、andFilterCompare()
但是格式是一样的

字符串格式,例如:'status=1'
哈希格式,例如: ['status' => 1, 'type' => 2]
操作符格式,例如:['like', 'name', 'test']

字符串和哈希格式很好理解,我们来看看操作符格式,因为操作符格式可以组成相对复杂的查询语句
最简单的就是官方给的例子

$status = 10;
$search = 'yii';

$query->where(['status' => $status]);

if (!empty($search)) {
    $query->andWhere(['like', 'title', $search]);
}
生成的语句就是
... WHERE (`status` = 10) AND (`title` LIKE '%yii%')

操作符格式

[操作符, 操作数1, 操作数2, ...]

第一个参数是操作符
操作符包括and、or、 like、in、 between等
第二个第三个都是操作数
0cb4d39e-418f-4183-a900-8a4ab5b1aadf.png

第一种最简单的就是上面提到的例子
 andWhere(['like', 'title','搜索的标题']);
生成的语句
... WHERE (`status` = 10) AND (`title` LIKE '%yii%')
第二种
addWhere(['and', 'id=1', 'name=2']);
生成的语句
... WHERE id=1 AND name=2
第三种
addWhere(['and', 'type=1', ['or', 'id=1', 'id=2']]);
生成的语句
... WHERE type=1 AND (id=1 OR id=2);
第四种
->andWhere(['or like','name',['哈哈','苦苦']]);
生成的语句
 WHERE `name` LIKE '%哈哈%' OR `name` LIKE '%苦苦%';
 第五种
 addWhere(['or',['like','name','哈哈'],['like','title','苦苦']]);//操作符格式的嵌套
 生成的语句
... WHERE (`status`=1) AND ((`name` LIKE '%哈哈%') OR (`title` LIKE '%苦苦%'))
觉得很赞
  • 评论于 2017-09-04 17:31 举报

    CredentialsType::find()->orWhere(['status' => 1, 'type' => 2])->orderBy('update_time desc')->asArray();
    上面打印sql:SELECT * FROM credentials_type WHERE (status=1) AND (type=2) ORDER BY update_time DESC
    竟然是以AND连接的 那这里的orWhere 和 andWhere有毛区别

    2 条回复
    评论于 2017-09-09 09:42 回复

    你的用法好像不对哦,应该是这样用的吧
    CredentialsType::find()->where()->orWhere()->orderBy()->asArray()->all();
    CredentialsType::find()->where()->andWhere()->orderBy()->asArray()->all();

    评论于 2017-11-03 14:18 回复

    任何WHERE 语句里的条件都是and连接的 orwhere指的是和前面一个条件或者你可以用区间来理解吧

    , 觉得很赞
  • 评论于 2018-08-28 14:16 举报

    $query->andWhere(new Expression('FIND_IN_SET('1,size')'));+
    生成的语句
    ... WHERE id=1 AND FIND_IN_SET(1, size)
    //size的值:1,2,3,4,5

    1 条回复
    评论于 2018-12-05 03:31 回复

    谢谢,学习了

  • 评论于 2019-04-11 16:48 举报

    我用了第一种方法,发现没有实现模糊查询。用第二种方法实现了。这是怎么回事?求解。
    第一种:
    $data = static::find()->->where(['like', 'sex', $this->keywords])->orWhere([ 'like', 'name', $this->keywords])->where(['state' => 1])->asArray()->orderBy('create_time', 3)->all();

    第二种:
    $data = static::find()->where(['sex' => $this->keywords])->orWhere(['name' => $this->keywords])->andWhere(['del' => 0])->asArray()->orderBy('create_time', 3)->all();

    我自己理解:where(['sex' => $this->keywords])->orWhere(['name' => $this->keywords])等同于['like', 'sex', $this->keywords],['or', 'like', 'name', $this->keywords]而第一种不能实现的原因在于重复了。
    感觉您在百忙之中的阅读,望大神们不吝赐教。

  • 评论于 2021-08-04 17:51 举报

    学到了啦啦啦啦啦啦

您需要登录后才可以评论。登录 | 立即注册