## 查詢范圍
對于一些常用的查詢條件,我們可以封裝成查詢范圍來進行方便的調用。
例如,郵箱地址為`thinkphp@qq.com`和status為1這兩個常用查詢條件,可以定義為模型類的兩個查詢范圍方法:
```
<pre class="calibre18">
```
<span class="hljs-operator"><span class="hljs-number"><?php</span><span class="hljs-keyword">namespace</span> <span class="hljs-title">app</span>\<span class="hljs-title">index</span>\<span class="hljs-title">model</span>;
<span class="hljs-keyword">use</span> <span class="hljs-title">think</span>\<span class="hljs-title">Model</span>;
<span class="hljs-operator"><span class="hljs-keyword">class</span> <span class="hljs-title">User</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">Model</span></span>{
<span class="hljs-comment">// 定義類型轉換</span><span class="hljs-keyword">protected</span> <span class="hljs-regexp">$type</span> = [
<span class="hljs-string">'birthday'</span> => <span class="hljs-string">'timestamp:Y/m/d'</span>,
];
<span class="hljs-comment">// 定義自動完成的屬性</span><span class="hljs-keyword">protected</span> <span class="hljs-regexp">$insert</span> = [<span class="hljs-string">'status'</span>];
<span class="hljs-comment">// status修改器</span><span class="hljs-keyword">protected</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">setStatusAttr</span><span class="hljs-number">(<span class="hljs-regexp">$value</span>, <span class="hljs-regexp">$data</span>)</span></span>{
<span class="hljs-keyword">return</span> <span class="hljs-string">'流年'</span> == <span class="hljs-regexp">$data</span>[<span class="hljs-string">'nickname'</span>] ? <span class="hljs-number">1</span> : <span class="hljs-number">2</span>;
}
<span class="hljs-comment">// status讀取器</span><span class="hljs-keyword">protected</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">getStatusAttr</span><span class="hljs-number">(<span class="hljs-regexp">$value</span>)</span></span>{
<span class="hljs-regexp">$status</span> = [-<span class="hljs-number">1</span> => <span class="hljs-string">'刪除'</span>, <span class="hljs-number">0</span> => <span class="hljs-string">'禁用'</span>, <span class="hljs-number">1</span> => <span class="hljs-string">'正常'</span>, <span class="hljs-number">2</span> => <span class="hljs-string">'待審核'</span>];
<span class="hljs-keyword">return</span> <span class="hljs-regexp">$status</span>[<span class="hljs-regexp">$value</span>];
}
<span class="hljs-comment">// email查詢</span><span class="hljs-keyword">protected</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">scopeEmail</span><span class="hljs-number">(<span class="hljs-regexp">$query</span>)</span></span>{
<span class="hljs-regexp">$query</span>->where(<span class="hljs-string">'email'</span>, <span class="hljs-string">'thinkphp@qq.com'</span>);
}
<span class="hljs-comment">// status查詢</span><span class="hljs-keyword">protected</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">scopeStatus</span><span class="hljs-number">(<span class="hljs-regexp">$query</span>)</span></span>{
<span class="hljs-regexp">$query</span>->where(<span class="hljs-string">'status'</span>, <span class="hljs-number">1</span>);
}
}</span>
```
```
查詢范圍方法的定義規范為:
> ### scope + 查詢范圍名稱
我們修改控制器的index方法如下:
```
<pre class="calibre18">
```
<span class="hljs-comment">// 根據查詢范圍獲取用戶數據列表</span><span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">index</span><span class="hljs-number">()</span></span>{
<span class="hljs-regexp">$list</span> = UserModel::scope(<span class="hljs-string">'email,status'</span>)->all();
<span class="hljs-keyword">foreach</span> (<span class="hljs-regexp">$list</span> <span class="hljs-keyword">as</span> <span class="hljs-regexp">$user</span>) {
<span class="hljs-keyword">echo</span> <span class="hljs-regexp">$user</span>->nickname . <span class="hljs-string">'<br/>'</span>;
<span class="hljs-keyword">echo</span> <span class="hljs-regexp">$user</span>->email . <span class="hljs-string">'<br/>'</span>;
<span class="hljs-keyword">echo</span> <span class="hljs-regexp">$user</span>->birthday . <span class="hljs-string">'<br/>'</span>;
<span class="hljs-keyword">echo</span> <span class="hljs-regexp">$user</span>->status . <span class="hljs-string">'<br/>'</span>;
<span class="hljs-keyword">echo</span> <span class="hljs-string">'-------------------------------------<br/>'</span>;
}
}
```
```
最后查詢的SQL語句是:
```
<pre class="calibre18">
```
<span class="hljs-operator">SELECT * <span class="hljs-keyword">FROM</span> <span class="hljs-string">`think_user`</span> <span class="hljs-keyword">WHERE</span> <span class="hljs-string">`email`</span> = <span class="hljs-string">'thinkphp@qq.com'</span> <span class="hljs-keyword">AND</span> <span class="hljs-string">`status`</span> = <span class="hljs-number">1</span> </span>
```
```
支持多次調用`scope`方法,并且可以追加新的查詢及鏈式操作,例如:
```
<pre class="calibre18">
```
<span class="hljs-comment">// 根據查詢范圍獲取用戶數據列表</span><span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">index</span><span class="hljs-number">()</span></span>{
<span class="hljs-comment">// </span><span class="hljs-regexp">$list</span> = UserModel::scope(<span class="hljs-string">'email'</span>)
->scope(<span class="hljs-string">'status'</span>)
->scope(<span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-number">(<span class="hljs-regexp">$query</span>)</span> </span>{
<span class="hljs-regexp">$query</span>->order(<span class="hljs-string">'id'</span>, <span class="hljs-string">'desc'</span>);
})
->all();
<span class="hljs-keyword">foreach</span> (<span class="hljs-regexp">$list</span> <span class="hljs-keyword">as</span> <span class="hljs-regexp">$user</span>) {
<span class="hljs-keyword">echo</span> <span class="hljs-regexp">$user</span>->nickname . <span class="hljs-string">'<br/>'</span>;
<span class="hljs-keyword">echo</span> <span class="hljs-regexp">$user</span>->email . <span class="hljs-string">'<br/>'</span>;
<span class="hljs-keyword">echo</span> <span class="hljs-regexp">$user</span>->birthday . <span class="hljs-string">'<br/>'</span>;
<span class="hljs-keyword">echo</span> <span class="hljs-regexp">$user</span>->status . <span class="hljs-string">'<br/>'</span>;
<span class="hljs-keyword">echo</span> <span class="hljs-string">'-------------------------------------<br/>'</span>;
}
}
```
```
上面的scope方法使用了閉包,閉包里面支持所有的鏈式操作方法。
最后生成的SQL語句是:
```
<pre class="calibre18">
```
<span class="hljs-operator">SELECT * <span class="hljs-keyword">FROM</span> <span class="hljs-string">`think_user`</span> <span class="hljs-keyword">WHERE</span> <span class="hljs-string">`email`</span> = <span class="hljs-string">'thinkphp@qq.com'</span> <span class="hljs-keyword">AND</span> <span class="hljs-string">`status`</span> = <span class="hljs-number">1</span> <span class="hljs-keyword">ORDER</span> <span class="hljs-keyword">BY</span> <span class="hljs-string">`id`</span> <span class="hljs-keyword">desc</span> </span>
```
```
查詢范圍方法支持額外的參數,例如`scopeEmail`方法改為:
```
<pre class="calibre18">
```
<span class="hljs-comment">// email查詢</span><span class="hljs-keyword">protected</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">scopeEmail</span><span class="hljs-number">(<span class="hljs-regexp">$query</span>, <span class="hljs-regexp">$email</span> = <span class="hljs-string">''</span>)</span></span>{
<span class="hljs-regexp">$query</span>->where(<span class="hljs-string">'email'</span>, <span class="hljs-regexp">$email</span>);
}
```
```
> 查詢范圍的方法的第一個參數必須是查詢對象,并且支持多個額外參數。
然后,使用下面的方式調用即可:
```
<pre class="calibre18">
```
<span class="hljs-regexp">$list</span> = UserModel::scope(<span class="hljs-string">'email'</span>,<span class="hljs-string">'thinkphp@qq.com'</span>)->all();
```
```
## 全局查詢范圍
可以給模型定義全局的查詢范圍,在模型類添加一個靜態的`base`方法即可,例如我們給模型類增加一個全局查詢范圍,用于查詢狀態為1的數據:
```
<pre class="calibre18">
```
<span class="hljs-operator"><span class="hljs-number"><?php</span><span class="hljs-keyword">namespace</span> <span class="hljs-title">app</span>\<span class="hljs-title">index</span>\<span class="hljs-title">model</span>;
<span class="hljs-keyword">use</span> <span class="hljs-title">think</span>\<span class="hljs-title">Model</span>;
<span class="hljs-operator"><span class="hljs-keyword">class</span> <span class="hljs-title">User</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">Model</span></span>{
<span class="hljs-comment">// 定義類型轉換</span><span class="hljs-keyword">protected</span> <span class="hljs-regexp">$type</span> = [
<span class="hljs-string">'birthday'</span> => <span class="hljs-string">'timestamp:Y/m/d'</span>,
];
<span class="hljs-comment">// 定義自動完成的屬性</span><span class="hljs-keyword">protected</span> <span class="hljs-regexp">$insert</span> = [<span class="hljs-string">'status'</span>];
<span class="hljs-comment">// status修改器</span><span class="hljs-keyword">protected</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">setStatusAttr</span><span class="hljs-number">(<span class="hljs-regexp">$value</span>, <span class="hljs-regexp">$data</span>)</span></span>{
<span class="hljs-keyword">return</span> <span class="hljs-string">'流年'</span> == <span class="hljs-regexp">$data</span>[<span class="hljs-string">'nickname'</span>] ? <span class="hljs-number">1</span> : <span class="hljs-number">2</span>;
}
<span class="hljs-comment">// status讀取器</span><span class="hljs-keyword">protected</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">getStatusAttr</span><span class="hljs-number">(<span class="hljs-regexp">$value</span>)</span></span>{
<span class="hljs-regexp">$status</span> = [-<span class="hljs-number">1</span> => <span class="hljs-string">'刪除'</span>, <span class="hljs-number">0</span> => <span class="hljs-string">'禁用'</span>, <span class="hljs-number">1</span> => <span class="hljs-string">'正常'</span>, <span class="hljs-number">2</span> => <span class="hljs-string">'待審核'</span>];
<span class="hljs-keyword">return</span> <span class="hljs-regexp">$status</span>[<span class="hljs-regexp">$value</span>];
}
<span class="hljs-comment">// email查詢</span><span class="hljs-keyword">protected</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">scopeEmail</span><span class="hljs-number">(<span class="hljs-regexp">$query</span>)</span></span>{
<span class="hljs-regexp">$query</span>->where(<span class="hljs-string">'email'</span>, <span class="hljs-string">'thinkphp@qq.com'</span>);
}
<span class="hljs-comment">// 全局查詢范圍</span><span class="hljs-keyword">protected</span> <span class="hljs-keyword">static</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">base</span><span class="hljs-number">(<span class="hljs-regexp">$query</span>)</span></span>{
<span class="hljs-comment">// 查詢狀態為1的數據</span><span class="hljs-regexp">$query</span>->where(<span class="hljs-string">'status'</span>,<span class="hljs-number">1</span>);
}
}</span>
```
```
當使用下面的查詢操作
```
<pre class="calibre18">
```
<span class="hljs-operator"><span class="hljs-title1">UserModel</span>:<span class="hljs-string">:<span class="hljs-function">scope</span>(<span class="hljs-operator">'email'</span>)-><span class="hljs-function">all</span>()</span></span>;
```
```
最后生成的SQL語句是:
```
<pre class="calibre18">
```
<span class="hljs-operator">SELECT * <span class="hljs-keyword">FROM</span> <span class="hljs-string">`think_user`</span> <span class="hljs-keyword">WHERE</span> <span class="hljs-string">`email`</span> = <span class="hljs-string">'thinkphp@qq.com'</span> <span class="hljs-keyword">AND</span> <span class="hljs-string">`status`</span> = <span class="hljs-number">1</span> <span class="hljs-keyword">ORDER</span> <span class="hljs-keyword">BY</span> <span class="hljs-string">`id`</span> <span class="hljs-keyword">desc</span> </span>
```
```
每次查詢都會自動帶上全局查詢范圍的查詢條件。
- 脕茫隆壟脨貌脩脭
- 脕茫隆壟脨貌脩脭
- 脪祿隆壟祿霉麓隆
- 脪祿隆壟祿霉麓隆
- 露鎂隆壟URL潞脥脗路脫脡
- 露鎂隆壟URL潞脥脗路脫脡
- 脠媒隆壟脟毛脟貿潞脥脧矛脫婁
- 脠媒隆壟脟毛脟貿潞脥脧矛脫婁
- 脣脛隆壟脢媒戮脻驢芒
- 脣脛隆壟脢媒戮脻驢芒
- 脦氓隆壟虜茅脩爐脫茂脩脭
- 脦氓隆壟虜茅脩爐脫茂脩脭
- 脕霉隆壟脛攏脨脥潞脥鹿脴脕陋
- 攏簍1攏漏脛攏脨脥露簍脪氓
- 攏簍2攏漏祿霉麓隆虜脵脳梅
- 攏簍3攏漏露脕脠隆脝梅潞脥脨脼賂脛脝梅
- 攏簍4攏漏脌脿脨脥脳陋祿祿潞脥脳脭露爐脥錨魯脡
- 攏簍5攏漏虜茅脩爐路露脦摟
- 攏簍6攏漏脢盲脠毛潞脥脩茅脰隴
- 攏簍7攏漏鹿脴脕陋
- 攏簍8攏漏脛攏脨脥脢盲魯枚
- 脝脽隆壟脢脫脥錄潞脥脛攏擄氓
- 脝脽隆壟脢脫脥錄潞脥脛攏擄氓
- 擄脣隆壟碌梅脢脭潞脥脠脮脰戮
- 擄脣隆壟碌梅脢脭潞脥脠脮脰戮
- 戮脜隆壟API驢陋路壟
- 戮脜隆壟API驢陋路壟
- 脢廬隆壟脙眉脕卯脨脨鹿隴戮脽
- 脢廬隆壟脙眉脕卯脨脨鹿隴戮脽
- 脢廬脪祿隆壟脌漏脮鹿
- 脢廬脪祿隆壟脌漏脮鹿
- 脢廬露鎂隆壟脭脫脧卯
- Cookie
- Session
- 碌樓脭陋虜芒脢脭
- 脥錄脧帽麓婁脌鉚
- 脦脛錄鎂脡脧麓蘆
- 脩茅脰隴脗毛
- 賂陸脗錄
- A隆壟魯攏錄沒脦脢脤芒錄爐
- B隆壟3.2潞脥5.0脟酶鹵冒
- C隆壟脰煤脢脰潞爐脢媒
- 路盧脥芒脝陋攏潞脩摟脧擄ThinkPHP5碌脛脮媒脠路脳脣脢脝
- 路盧脥芒脝陋攏潞脩摟脧擄ThinkPHP5碌脛脮媒脠路脳脣脢脝