Yii2.0查詢方法

基礎(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)的索引方案,


yii2.0中文手冊(cè)網(wǎng)址::http://www.yiichina.com/doc/guide/2.0/db-query-builder

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末驴一,一起剝皮案震驚了整個(gè)濱河市休雌,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌肝断,老刑警劉巖杈曲,帶你破解...
    沈念sama閱讀 210,914評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異胸懈,居然都是意外死亡担扑,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評(píng)論 2 383
  • 文/潘曉璐 我一進(jìn)店門趣钱,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)涌献,“玉大人,你說(shuō)我怎么就攤上這事首有⊙嗬” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,531評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵井联,是天一觀的道長(zhǎng)卜壕。 經(jīng)常有香客問(wèn)我,道長(zhǎng)烙常,這世上最難降的妖魔是什么轴捎? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,309評(píng)論 1 282
  • 正文 為了忘掉前任,我火速辦了婚禮军掂,結(jié)果婚禮上轮蜕,老公的妹妹穿的比我還像新娘。我一直安慰自己蝗锥,他們只是感情好跃洛,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,381評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著终议,像睡著了一般汇竭。 火紅的嫁衣襯著肌膚如雪葱蝗。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,730評(píng)論 1 289
  • 那天细燎,我揣著相機(jī)與錄音两曼,去河邊找鬼。 笑死玻驻,一個(gè)胖子當(dāng)著我的面吹牛悼凑,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播璧瞬,決...
    沈念sama閱讀 38,882評(píng)論 3 404
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼户辫,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了嗤锉?” 一聲冷哼從身側(cè)響起渔欢,我...
    開(kāi)封第一講書(shū)人閱讀 37,643評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎瘟忱,沒(méi)想到半個(gè)月后奥额,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,095評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡访诱,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,448評(píng)論 2 325
  • 正文 我和宋清朗相戀三年垫挨,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片盐数。...
    茶點(diǎn)故事閱讀 38,566評(píng)論 1 339
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡棒拂,死狀恐怖伞梯,靈堂內(nèi)的尸體忽然破棺而出玫氢,到底是詐尸還是另有隱情,我是刑警寧澤谜诫,帶...
    沈念sama閱讀 34,253評(píng)論 4 328
  • 正文 年R本政府宣布漾峡,位于F島的核電站,受9級(jí)特大地震影響喻旷,放射性物質(zhì)發(fā)生泄漏生逸。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,829評(píng)論 3 312
  • 文/蒙蒙 一且预、第九天 我趴在偏房一處隱蔽的房頂上張望槽袄。 院中可真熱鬧,春花似錦锋谐、人聲如沸遍尺。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,715評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)乾戏。三九已至迂苛,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間鼓择,已是汗流浹背三幻。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,945評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留呐能,地道東北人念搬。 一個(gè)月前我還...
    沈念sama閱讀 46,248評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像摆出,于是被迫代替她去往敵國(guó)和親锁蠕。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,440評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容