Yii2.0查询方法

基础操作:

  User::find()->one();    此方法返回一条数据(以下所有User统一为数据表);

  User::find()->all();    此方法返回所有数据;

  User::find()->count();    此方法返回记录的数量;

  User::find()->average();    此方法返回指定列的平均值;

  User::find()->min();    此方法返回指定列的最小值 ;

  User::find()->max();    此方法返回指定列的最大值 ;

  User::find()->scalar();    此方法返回值的第一行第一列的查询结果;

  User::find()->column();    此方法返回查询结果中的第一列的值;

  User::find()->exists();    此方法返回一个值指示是否包含查询结果的数据行;

  User::findOne($id);  此方法返回 主键 id=1的一条数据(举个例子);

  User::find()->where(['name'=>'小伙儿'])->one();  此方法返回 ['name'=>'小伙儿'] 的一条数据;

  User::find()->where(['name'=>'小伙儿'])->all();  此方法返回 ['name'=>'小伙儿'] 的所有数据;

  User::find()->orderBy('id DESC')->all();  此方法是排序查询;

  User::findBySql('SELECT * FROM user')->all();  此方法是用 sql  语句查询 user 表里面的所有数据\\或者末尾加one()则查询一条;

  User::find()->andWhere(['sex'=>'男','age'=>'24'])->count('id');  统计符合条件的总条数;

  User::find()->andFilterWhere(['like','name','小伙儿']); 此方法是用 like 查询 name 等于 小伙儿的 数据

  User::find()->batch(10);  每次取10条数据 User::find()->each(10);  每次取10条数据, 迭代查询

select() distinct() addSelect()

select()

  select()方法用来指定 SQL 语句当中的SELECT子句。可以使用一个数组或者字符串来定义需要查询的字段。当 SQL 语句是由查询对象生成的时候,被查询的字段名称将会自动的被引号括起来。如果你在组建查询时没有调用select()方法,那么选择的将是'*',也即选取的是所有的字段。

  distinct() 方法来去除重复行

  addSelect() 方法来选取附加字段

from()

   from()方法指定了 SQL 语句当中的FROM子句。可以通过字符串或者数组的形式来定义被查询的表名称。除了表名以外,你还可以从子查询中再次查询,这里的子查询是由yii\db\Query创建的对象。

where()

  where()方法定义了 SQL 语句当中的WHERE子句。你可以使用如下三种格式来定义WHERE条件:

  字符串格式,例如:'status=1'

  哈希格式,例如:['status' => 1, 'type' => 2]

  操作符格式,例如:['like', 'name', 'test']

字符串格式

  在定义非常简单的查询条件的时候,字符串格式是最合适的。当使用参数绑定的时候,你可以调用params()或者addParams()方法来分别绑定不同的参数。

哈希格式

  哈希格式最适合用来指定多个AND串联起来的简单的"等于断言"子条件。它是以数组的形式来书写的,数组的键表示字段的名称,而数组的值则表示这个字段需要匹配的值

操作符格式(

  操作符格式允许你指定类程序风格的任意条件语句

各种操作符:

and:

  操作数会被AND关键字串联起来。例如,['and', 'id=1', 'id=2']将会生成id=1 AND id=2。如果操作数是一个数组,它也会按上述规则转换成字符串。例如,['and', 'type=1', ['or', 'id=1', 'id=2']]将会生成type=1 AND (id=1 OR id=2)。这个方法不会自动加引号或者转义。

or:

  用法和and操作符类似,这里就不再赘述。

between:

  第一个操作数为字段名称,第二个和第三个操作数代表的是这个字段的取值范围。例如,['between', 'id', 1, 10]将会生成id BETWEEN 1 AND 10。

in:

  第一个操作数应为字段名称或者 DB 表达式。第二个操作符既可以是一个数组,也可以是一个Query对象。它会转换成IN条件语句。如果第二个操作数是一个数组,那么它代表的是字段或 DB 表达式的取值范围。如果第二个操作数是Query对象,那么这个子查询的结果集将会作为第一个操作符的字段或者 DB 表达式的取值范围。例如,['in', 'id', [1, 2, 3]]将生成id IN (1, 2, 3)。该方法将正确地为字段名加引号以及为取值范围转义。in操作符还支持组合字段,此时,操作数1应该是一个字段名数组,而操作数2应该是一个数组或者Query对象,代表这些字段的取值范围。

not in:

  用法和in操作符类似,这里就不再赘述。

like:

    第一个操作数应为一个字段名称或 DB 表达式,第二个操作数可以使字符串或数组,代表第一个操作数需要模糊查询的值。比如,['like', 'name', 'tester']会生成name LIKE '%tester%'。 如果范围值是一个数组,那么将会生成用AND串联起来的多个like语句。例如,['like', 'name', ['test', 'sample']]将会生成name LIKE '%test%' AND name LIKE '%sample%'。你也可以提供第三个可选的操作数来指定应该如何转义数值当中的特殊字符。该操作数是一个从需要被转义的特殊字符到转义副本的数组映射。如果没有提供这个操作数,将会使用默认的转义映射。如果需要禁用转义的功能,只需要将参数设置为false或者传入一个空数组即可。需要注意的是,当使用转义映射(又或者没有提供第三个操作数的时候),第二个操作数的值的前后将会被加上百分号。

  注意:当使用 PostgreSQL 的时候你还可以使用ilike,该方法对大小写不敏感。

or like:

   用法和like操作符类似,区别在于当第二个操作数为数组时,会使用OR来串联多个LIKE条件语句。

not like:

  用法和like操作符类似,区别在于会使用NOT LIKE来生成条件语句。

or not like:

  用法和not like操作符类似,区别在于会使用OR来串联多个NOT LIKE条件语句。

exists:

  需要一个操作数,该操作数必须是代表子查询yii\db\Query的一个实例,它将会构建一个EXISTS (sub-query)表达式。

not exists:

  用法和exists操作符类似,它将创建一个NOT EXISTS (sub-query)表达式。

  >,<=, 或者其他包含两个操作数的合法 DB 操作符: 第一个操作数必须为字段的名称,而第二个操作数则应为一个值。例如,['>', 'age', 10]将会生成age>10。

);

附加条件

  你可以使用andWhere()或者orWhere()在原有条件的基础上附加额外的条件。你可以多次调用这些方法来分别追加不同的条件。

过滤条件

  当WHERE条件来自于用户的输入时,你通常需要忽略用户输入的空值。例如,在一个可以通过用户名或者邮箱搜索的表单当中,用户名或者邮箱输入框没有输入任何东西,这种情况下你想要忽略掉对应的搜索条件,那么你就可以使用yii\db\Query::filterWhere()方法来实现这个目的:

  提示:当一个值为 null、空数组、空字符串或者一个只包含空白字符时,那么它将被判定为空值。

yii\db\Query::orderBy()

  yii\db\Query::orderBy()方法是用来指定 SQL 语句当中的ORDER BY子句的。数组当中的键指代的是字段名称,而数组当中的值则表示的是排序的方式。PHP 的常量SORT_ASC指的是升序排列,SORT_DESC指的则是降序排列。

  注意:当ORDER BY语句包含一些 DB 表达式的时候,你应该使用数组的格式。

  你可以调用 [yii\db\Query::addOrderBy()|addOrderBy()]] 来为ORDER BY片断添加额外的子句。

groupBy()

  groupBY()方法是用来指定 SQL 语句当中的GROUP BY片断的。如果GROUP BY仅仅包含简单的字段名称,你可以使用字符串来声明它,就像写原生的 SQL 语句一样。

  注意:当GROUP BY语句包含一些 DB 表达式的时候,你应该使用数组的格式。

  你可以调用 [yii\db\Query::addOrderBy()|addOrderBy()]] 来为GROUP BY子句添加额外的字段。

having()

  having方法是用来指定 SQL 语句当中的HAVING子句。它带有一个条件,和where()中指定条件的方法一样。可以调用andHaving()或者orHaving()方法来为HAVING子句追加额外的条件.

yii\db\Query::limit()和yii\db\Query::offset()

  yii\db\Query::limit()和yii\db\Query::offset()是用来指定 SQL 语句当中的LIMIT和OFFSET子句的。

  提示:在不支持LIMIT和OFFSET的 DBMS 中(例如,MSSQL),  查询构建器将生成一条模拟LIMIT/OFFSET行为的 SQL 语句。

join()

 [yii\db\Query::join()|join()]] 是用来指定 SQL 语句当中的JOIN子句的。

 join()带有四个参数:

  $type: 连接类型,例如:'INNER JOIN','LEFT JOIN'。

  $table: 将要连接的表名称。

  $on:可选的连接状态;

  $params: 可选参数,与连接条件绑定的参数。

  你可以分别调用如下的快捷方法来指定INNER JOIN,LEFT JOIN和RIGHT JOIN。可以通过多次调用如上所述的连接方法来连接多张表,每连接一张表调用一次。除了连接表以外,你还可以连接子查询。方法如下,将需要被连接的子查询指定为一个yii\db\Query()对象

union()

  union()方法是用来指定 SQL 语句当中的UNION子句的。可以通过多次调用union()方法来追加更多的UNION子句。

查询方法

  yii\db\Query提供了一整套的用于不同查询目的的方法。

  count(): 返回COUNT查询的结果。

  其它集合查询方法: 包括sum($q).average($q).max($q),min($q)等.$q是一个必选参数,既可以是一个字段名称,又可以是一个 DB 表达式。

  注意:one()方法只返回查询结果当中的第一条数据,  条件语句中不会加上LIMIT 1条件。如果你清楚的知道查询将会只返回一行或几行数据  (例如, 如果你是通过某些主键来查询的),这很好也提倡这样做。但是,如果查询结果  有机会返回大量的数据时,那么你应该显示调用limit(1)方法,以改善性能。  例如,(new \yii\db\Query())->from('user')->limit(1)->one()。

  当你调用yii\db\Query当中的一个查询方法的时候,实际上内在的运作机制如下:

    在当前yii\db\Query的构造基础之上,调用yii\db\QueryBuilder来生成一条 SQL 语句;

    利用生成的 SQL 语句创建一个yii\db\Command对象;

    调用yii\db\Command的查询方法(例如,queryAll())来执行这条 SQL 语句,并检索数据。

索引查询结果

当你在调用all()方法时,它将返回一个以连续的整型数值为索引的数组。而有时候你可能希望使用一个特定的字段或者表达式的值来作为索引结果集数组。那么你可以在调用all()之前使用yii\db\Query::indexBy()方法来达到这个目的。

批处理查询

  当需要处理大数据的时候,像yii\db\Query::all()这样的方法就不太合适了,因为它们会把所有数据都读取到内存上。为了保持较低的内存需求, Yii 提供了一个所谓的批处理查询的支持。批处理查询会利用数据游标将数据以批为单位取出来.yii\db\Query::batch()和yii\db\Query::each()方法将会返回一个实现了Iterator接口yii\db\BatchQueryResult的对象,可以用在foreach结构当中使用。在第一次迭代取数据的时候,数据库会执行一次 SQL 查询,然后在剩下的迭代中,将直接从结果集中批量获取数据。默认情况下,一批的大小为 100,也就意味着一批获取的数据是 100 行。你可以通过给batch()或者each()方法的第一个参数传值来改变每批行数的大小。

  相对于yii\db\Query::all()方法,批处理查询每次只读取 100 行的数据到内存。如果你在处理完这些数据后及时丢弃这些数据,那么批处理查询可以很好的帮助降低内存的占用率。

  如果你通过yii\db\Query::indexBy()方法为查询结果指定了索引字段,那么批处理查询将仍然保持相对应的索引方案,


yii2.0中文手册网址::http://www.yiichina.com/doc/guide/2.0/db-query-builder

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容