基礎(chǔ)操作:
? User::find()->one();? ? 此方法返回一條數(shù)據(jù)(以下所有User統(tǒng)一為數(shù)據(jù)表)艘包;
? User::find()->all();? ? 此方法返回所有數(shù)據(jù);
? User::find()->count();? ? 此方法返回記錄的數(shù)量场钉;
? User::find()->average();? ? 此方法返回指定列的平均值;
? User::find()->min();? ? 此方法返回指定列的最小值 ;
? User::find()->max();? ? 此方法返回指定列的最大值 链沼;
? User::find()->scalar();? ? 此方法返回值的第一行第一列的查詢結(jié)果;
? User::find()->column();? ? 此方法返回查詢結(jié)果中的第一列的值沛鸵;
? User::find()->exists();? ? 此方法返回一個(gè)值指示是否包含查詢結(jié)果的數(shù)據(jù)行括勺;
? User::findOne($id);? 此方法返回 主鍵 id=1的一條數(shù)據(jù)(舉個(gè)例子);
? User::find()->where(['name'=>'小伙兒'])->one();? 此方法返回 ['name'=>'小伙兒'] 的一條數(shù)據(jù)曲掰;
? User::find()->where(['name'=>'小伙兒'])->all();? 此方法返回 ['name'=>'小伙兒'] 的所有數(shù)據(jù)疾捍;
? User::find()->orderBy('id DESC')->all();? 此方法是排序查詢;
? User::findBySql('SELECT * FROM user')->all();? 此方法是用 sql? 語(yǔ)句查詢 user 表里面的所有數(shù)據(jù)\\或者末尾加one()則查詢一條栏妖;
? User::find()->andWhere(['sex'=>'男','age'=>'24'])->count('id');? 統(tǒng)計(jì)符合條件的總條數(shù)乱豆;
? User::find()->andFilterWhere(['like','name','小伙兒']); 此方法是用 like 查詢 name 等于 小伙兒的 數(shù)據(jù)
? User::find()->batch(10);? 每次取10條數(shù)據(jù) User::find()->each(10);? 每次取10條數(shù)據(jù), 迭代查詢
select() distinct() addSelect()
select()
? select()方法用來(lái)指定 SQL 語(yǔ)句當(dāng)中的SELECT子句吊趾⊥鹪#可以使用一個(gè)數(shù)組或者字符串來(lái)定義需要查詢的字段。當(dāng) SQL 語(yǔ)句是由查詢對(duì)象生成的時(shí)候论泛,被查詢的字段名稱將會(huì)自動(dòng)的被引號(hào)括起來(lái)揩尸。如果你在組建查詢時(shí)沒(méi)有調(diào)用select()方法,那么選擇的將是'*'屁奏,也即選取的是所有的字段岩榆。
? distinct() 方法來(lái)去除重復(fù)行
? addSelect() 方法來(lái)選取附加字段
from()
?? from()方法指定了 SQL 語(yǔ)句當(dāng)中的FROM子句》仄埃可以通過(guò)字符串或者數(shù)組的形式來(lái)定義被查詢的表名稱勇边。除了表名以外,你還可以從子查詢中再次查詢折联,這里的子查詢是由yii\db\Query創(chuàng)建的對(duì)象粥诫。
where()
? where()方法定義了 SQL 語(yǔ)句當(dāng)中的WHERE子句。你可以使用如下三種格式來(lái)定義WHERE條件:
? 字符串格式崭庸,例如:'status=1'
? 哈希格式怀浆,例如:['status' => 1, 'type' => 2]
? 操作符格式,例如:['like', 'name', 'test']
字符串格式
? 在定義非常簡(jiǎn)單的查詢條件的時(shí)候怕享,字符串格式是最合適的执赡。當(dāng)使用參數(shù)綁定的時(shí)候,你可以調(diào)用params()或者addParams()方法來(lái)分別綁定不同的參數(shù)函筋。
哈希格式
? 哈希格式最適合用來(lái)指定多個(gè)AND串聯(lián)起來(lái)的簡(jiǎn)單的"等于斷言"子條件沙合。它是以數(shù)組的形式來(lái)書(shū)寫(xiě)的,數(shù)組的鍵表示字段的名稱跌帐,而數(shù)組的值則表示這個(gè)字段需要匹配的值
操作符格式(
? 操作符格式允許你指定類程序風(fēng)格的任意條件語(yǔ)句
各種操作符:
and:
? 操作數(shù)會(huì)被AND關(guān)鍵字串聯(lián)起來(lái)。例如,['and', 'id=1', 'id=2']將會(huì)生成id=1 AND id=2速侈。如果操作數(shù)是一個(gè)數(shù)組酷宵,它也會(huì)按上述規(guī)則轉(zhuǎn)換成字符串。例如,['and', 'type=1', ['or', 'id=1', 'id=2']]將會(huì)生成type=1 AND (id=1 OR id=2)。這個(gè)方法不會(huì)自動(dòng)加引號(hào)或者轉(zhuǎn)義。
or:
? 用法和and操作符類似藐俺,這里就不再贅述。
between:
? 第一個(gè)操作數(shù)為字段名稱泥彤,第二個(gè)和第三個(gè)操作數(shù)代表的是這個(gè)字段的取值范圍欲芹。例如,['between', 'id', 1, 10]將會(huì)生成id BETWEEN 1 AND 10吟吝。
in:
? 第一個(gè)操作數(shù)應(yīng)為字段名稱或者 DB 表達(dá)式菱父。第二個(gè)操作符既可以是一個(gè)數(shù)組,也可以是一個(gè)Query對(duì)象剑逃。它會(huì)轉(zhuǎn)換成IN條件語(yǔ)句滞伟。如果第二個(gè)操作數(shù)是一個(gè)數(shù)組,那么它代表的是字段或 DB 表達(dá)式的取值范圍炕贵。如果第二個(gè)操作數(shù)是Query對(duì)象梆奈,那么這個(gè)子查詢的結(jié)果集將會(huì)作為第一個(gè)操作符的字段或者 DB 表達(dá)式的取值范圍。例如称开,['in', 'id', [1, 2, 3]]將生成id IN (1, 2, 3)亩钟。該方法將正確地為字段名加引號(hào)以及為取值范圍轉(zhuǎn)義。in操作符還支持組合字段鳖轰,此時(shí)清酥,操作數(shù)1應(yīng)該是一個(gè)字段名數(shù)組,而操作數(shù)2應(yīng)該是一個(gè)數(shù)組或者Query對(duì)象蕴侣,代表這些字段的取值范圍焰轻。
not in:
? 用法和in操作符類似,這里就不再贅述昆雀。
like:
??? 第一個(gè)操作數(shù)應(yīng)為一個(gè)字段名稱或 DB 表達(dá)式辱志,第二個(gè)操作數(shù)可以使字符串或數(shù)組,代表第一個(gè)操作數(shù)需要模糊查詢的值狞膘。比如揩懒,['like', 'name', 'tester']會(huì)生成name LIKE '%tester%'。 如果范圍值是一個(gè)數(shù)組挽封,那么將會(huì)生成用AND串聯(lián)起來(lái)的多個(gè)like語(yǔ)句已球。例如,['like', 'name', ['test', 'sample']]將會(huì)生成name LIKE '%test%' AND name LIKE '%sample%'。你也可以提供第三個(gè)可選的操作數(shù)來(lái)指定應(yīng)該如何轉(zhuǎn)義數(shù)值當(dāng)中的特殊字符智亮。該操作數(shù)是一個(gè)從需要被轉(zhuǎn)義的特殊字符到轉(zhuǎn)義副本的數(shù)組映射忆某。如果沒(méi)有提供這個(gè)操作數(shù),將會(huì)使用默認(rèn)的轉(zhuǎn)義映射阔蛉。如果需要禁用轉(zhuǎn)義的功能弃舒,只需要將參數(shù)設(shè)置為false或者傳入一個(gè)空數(shù)組即可。需要注意的是馍忽,當(dāng)使用轉(zhuǎn)義映射(又或者沒(méi)有提供第三個(gè)操作數(shù)的時(shí)候),第二個(gè)操作數(shù)的值的前后將會(huì)被加上百分號(hào)燕差。
? 注意:當(dāng)使用 PostgreSQL 的時(shí)候你還可以使用ilike遭笋,該方法對(duì)大小寫(xiě)不敏感。
or like:
?? 用法和like操作符類似徒探,區(qū)別在于當(dāng)?shù)诙€(gè)操作數(shù)為數(shù)組時(shí)瓦呼,會(huì)使用OR來(lái)串聯(lián)多個(gè)LIKE條件語(yǔ)句。
not like:
? 用法和like操作符類似测暗,區(qū)別在于會(huì)使用NOT LIKE來(lái)生成條件語(yǔ)句央串。
or not like:
? 用法和not like操作符類似,區(qū)別在于會(huì)使用OR來(lái)串聯(lián)多個(gè)NOT LIKE條件語(yǔ)句碗啄。
exists:
? 需要一個(gè)操作數(shù)质和,該操作數(shù)必須是代表子查詢yii\db\Query的一個(gè)實(shí)例,它將會(huì)構(gòu)建一個(gè)EXISTS (sub-query)表達(dá)式稚字。
not exists:
? 用法和exists操作符類似饲宿,它將創(chuàng)建一個(gè)NOT EXISTS (sub-query)表達(dá)式。
? >,<=, 或者其他包含兩個(gè)操作數(shù)的合法 DB 操作符: 第一個(gè)操作數(shù)必須為字段的名稱胆描,而第二個(gè)操作數(shù)則應(yīng)為一個(gè)值瘫想。例如,['>', 'age', 10]將會(huì)生成age>10昌讲。
)国夜;
附加條件
? 你可以使用andWhere()或者orWhere()在原有條件的基礎(chǔ)上附加額外的條件。你可以多次調(diào)用這些方法來(lái)分別追加不同的條件短绸。
過(guò)濾條件
? 當(dāng)WHERE條件來(lái)自于用戶的輸入時(shí)车吹,你通常需要忽略用戶輸入的空值。例如醋闭,在一個(gè)可以通過(guò)用戶名或者郵箱搜索的表單當(dāng)中礼搁,用戶名或者郵箱輸入框沒(méi)有輸入任何東西,這種情況下你想要忽略掉對(duì)應(yīng)的搜索條件目尖,那么你就可以使用yii\db\Query::filterWhere()方法來(lái)實(shí)現(xiàn)這個(gè)目的:
? 提示:當(dāng)一個(gè)值為 null馒吴、空數(shù)組、空字符串或者一個(gè)只包含空白字符時(shí),那么它將被判定為空值饮戳。
yii\db\Query::orderBy()
? yii\db\Query::orderBy()方法是用來(lái)指定 SQL 語(yǔ)句當(dāng)中的ORDER BY子句的豪治。數(shù)組當(dāng)中的鍵指代的是字段名稱,而數(shù)組當(dāng)中的值則表示的是排序的方式扯罐。PHP 的常量SORT_ASC指的是升序排列负拟,SORT_DESC指的則是降序排列。
? 注意:當(dāng)ORDER BY語(yǔ)句包含一些 DB 表達(dá)式的時(shí)候歹河,你應(yīng)該使用數(shù)組的格式掩浙。
? 你可以調(diào)用 [yii\db\Query::addOrderBy()|addOrderBy()]] 來(lái)為ORDER BY片斷添加額外的子句。
groupBy()
? groupBY()方法是用來(lái)指定 SQL 語(yǔ)句當(dāng)中的GROUP BY片斷的秸歧。如果GROUP BY僅僅包含簡(jiǎn)單的字段名稱厨姚,你可以使用字符串來(lái)聲明它,就像寫(xiě)原生的 SQL 語(yǔ)句一樣键菱。
? 注意:當(dāng)GROUP BY語(yǔ)句包含一些 DB 表達(dá)式的時(shí)候谬墙,你應(yīng)該使用數(shù)組的格式。
? 你可以調(diào)用 [yii\db\Query::addOrderBy()|addOrderBy()]] 來(lái)為GROUP BY子句添加額外的字段经备。
having()
? having方法是用來(lái)指定 SQL 語(yǔ)句當(dāng)中的HAVING子句拭抬。它帶有一個(gè)條件,和where()中指定條件的方法一樣侵蒙≡旎ⅲ可以調(diào)用andHaving()或者orHaving()方法來(lái)為HAVING子句追加額外的條件.
yii\db\Query::limit()和yii\db\Query::offset()
? yii\db\Query::limit()和yii\db\Query::offset()是用來(lái)指定 SQL 語(yǔ)句當(dāng)中的LIMIT和OFFSET子句的。
? 提示:在不支持LIMIT和OFFSET的 DBMS 中(例如纷闺,MSSQL)累奈,? 查詢構(gòu)建器將生成一條模擬LIMIT/OFFSET行為的 SQL 語(yǔ)句。
join()
?[yii\db\Query::join()|join()]] 是用來(lái)指定 SQL 語(yǔ)句當(dāng)中的JOIN子句的急但。
?join()帶有四個(gè)參數(shù):
? $type: 連接類型澎媒,例如:'INNER JOIN','LEFT JOIN'。
? $table: 將要連接的表名稱波桩。
? $on:可選的連接狀態(tài);
? $params: 可選參數(shù)戒努,與連接條件綁定的參數(shù)。
? 你可以分別調(diào)用如下的快捷方法來(lái)指定INNER JOIN,LEFT JOIN和RIGHT JOIN镐躲〈⒚担可以通過(guò)多次調(diào)用如上所述的連接方法來(lái)連接多張表,每連接一張表調(diào)用一次萤皂。除了連接表以外撒穷,你還可以連接子查詢。方法如下裆熙,將需要被連接的子查詢指定為一個(gè)yii\db\Query()對(duì)象
union()
? union()方法是用來(lái)指定 SQL 語(yǔ)句當(dāng)中的UNION子句的端礼∏菪Γ可以通過(guò)多次調(diào)用union()方法來(lái)追加更多的UNION子句。
查詢方法
? yii\db\Query提供了一整套的用于不同查詢目的的方法蛤奥。
? count(): 返回COUNT查詢的結(jié)果佳镜。
? 其它集合查詢方法: 包括sum($q).average($q).max($q),min($q)等.$q是一個(gè)必選參數(shù),既可以是一個(gè)字段名稱凡桥,又可以是一個(gè) DB 表達(dá)式蟀伸。
? 注意:one()方法只返回查詢結(jié)果當(dāng)中的第一條數(shù)據(jù),? 條件語(yǔ)句中不會(huì)加上LIMIT 1條件缅刽。如果你清楚的知道查詢將會(huì)只返回一行或幾行數(shù)據(jù)? (例如啊掏, 如果你是通過(guò)某些主鍵來(lái)查詢的),這很好也提倡這樣做衰猛。但是迟蜜,如果查詢結(jié)果? 有機(jī)會(huì)返回大量的數(shù)據(jù)時(shí),那么你應(yīng)該顯示調(diào)用limit(1)方法腕侄,以改善性能小泉。? 例如芦疏,(new \yii\db\Query())->from('user')->limit(1)->one()冕杠。
? 當(dāng)你調(diào)用yii\db\Query當(dāng)中的一個(gè)查詢方法的時(shí)候,實(shí)際上內(nèi)在的運(yùn)作機(jī)制如下:
? ? 在當(dāng)前yii\db\Query的構(gòu)造基礎(chǔ)之上酸茴,調(diào)用yii\db\QueryBuilder來(lái)生成一條 SQL 語(yǔ)句分预;
? ? 利用生成的 SQL 語(yǔ)句創(chuàng)建一個(gè)yii\db\Command對(duì)象;
? ? 調(diào)用yii\db\Command的查詢方法(例如薪捍,queryAll())來(lái)執(zhí)行這條 SQL 語(yǔ)句笼痹,并檢索數(shù)據(jù)。
索引查詢結(jié)果
當(dāng)你在調(diào)用all()方法時(shí)酪穿,它將返回一個(gè)以連續(xù)的整型數(shù)值為索引的數(shù)組凳干。而有時(shí)候你可能希望使用一個(gè)特定的字段或者表達(dá)式的值來(lái)作為索引結(jié)果集數(shù)組。那么你可以在調(diào)用all()之前使用yii\db\Query::indexBy()方法來(lái)達(dá)到這個(gè)目的被济。
批處理查詢
? 當(dāng)需要處理大數(shù)據(jù)的時(shí)候救赐,像yii\db\Query::all()這樣的方法就不太合適了,因?yàn)樗鼈儠?huì)把所有數(shù)據(jù)都讀取到內(nèi)存上只磷。為了保持較低的內(nèi)存需求经磅, Yii 提供了一個(gè)所謂的批處理查詢的支持。批處理查詢會(huì)利用數(shù)據(jù)游標(biāo)將數(shù)據(jù)以批為單位取出來(lái).yii\db\Query::batch()和yii\db\Query::each()方法將會(huì)返回一個(gè)實(shí)現(xiàn)了Iterator接口yii\db\BatchQueryResult的對(duì)象钮追,可以用在foreach結(jié)構(gòu)當(dāng)中使用预厌。在第一次迭代取數(shù)據(jù)的時(shí)候,數(shù)據(jù)庫(kù)會(huì)執(zhí)行一次 SQL 查詢元媚,然后在剩下的迭代中轧叽,將直接從結(jié)果集中批量獲取數(shù)據(jù)苗沧。默認(rèn)情況下,一批的大小為 100犹芹,也就意味著一批獲取的數(shù)據(jù)是 100 行崎页。你可以通過(guò)給batch()或者each()方法的第一個(gè)參數(shù)傳值來(lái)改變每批行數(shù)的大小。
? 相對(duì)于yii\db\Query::all()方法腰埂,批處理查詢每次只讀取 100 行的數(shù)據(jù)到內(nèi)存飒焦。如果你在處理完這些數(shù)據(jù)后及時(shí)丟棄這些數(shù)據(jù),那么批處理查詢可以很好的幫助降低內(nèi)存的占用率屿笼。
? 如果你通過(guò)yii\db\Query::indexBy()方法為查詢結(jié)果指定了索引字段牺荠,那么批處理查詢將仍然保持相對(duì)應(yīng)的索引方案,