## 查詢范圍
對于一些常用的查詢條件,我們可以事先定義好,以便快速調用,這個事先定義的查詢條件方法有一個統一的前綴`scope`,我們稱之為查詢范圍,例如下面給`User`模型定義了兩個查詢范圍方法。
~~~php
<?php
namespace app\model;
use think\Model;
class User extends Model
{
public function scopeThinkphp($query)
{
$query->where('name','thinkphp')->field('id,name');
}
public function scopeAge($query)
{
$query->where('age','>',20)->limit(10);
}
}
~~~
就可以進行下面的條件查詢:
~~~
// 查找name為thinkphp的用戶
User::scope('thinkphp')->find();
// 查找年齡大于20的10個用戶
User::scope('age')->select();
// 查找name為thinkphp的用戶并且年齡大于20的10個用戶
User::scope('thinkphp,age')->select();
~~~
查詢范圍的方法可以定義額外的參數,例如`User`模型類定義如下:
~~~
<?php
namespace app\model;
use think\Model;
class User extends Model
{
public function scopeEmail($query, $email)
{
$query->where('email', 'like', '%' . $email . '%');
}
public function scopeScore($query, $score)
{
$query->where('score', '>', $score);
}
}
~~~
在查詢的時候可以如下使用:
~~~
// 查詢email包含thinkphp和分數大于80的用戶
User::email('thinkphp')->score(80)->select();
~~~
可以直接使用閉包函數進行查詢,例如:
~~~
User::scope(function($query){
$query->where('age','>',20)->limit(10);
})->select();
~~~
>[danger] 使用查詢范圍后,只能使用`find`或者`select`查詢。
## 全局查詢范圍
支持在模型里面設置`globalScope`屬性,定義全局的查詢范圍
~~~
<?php
namespace app\model;
use think\Model;
class User extends Model
{
// 定義全局的查詢范圍
protected $globalScope = ['status'];
public function scopeStatus($query)
{
$query->where('status',1);
}
}
~~~
然后,執行下面的代碼:
~~~
$user = User::find(1);
~~~
最終的查詢條件會是
~~~
status = 1 AND id = 1
~~~
如果需要動態關閉所有的全局查詢范圍,可以使用:
~~~
// 關閉全局查詢范圍
User::withoutGlobalScope()->select();
~~~
可以使用`withoutGlobalScope`方法動態關閉部分全局查詢范圍。
```
User::withoutGlobalScope(['status'])->select();
```
- 簡介
- 數據庫配置
- 分布式數據庫
- 查詢構造器
- 查詢數據
- 新增數據
- 更新數據
- 刪除數據
- 鏈式操作
- Where
- Table
- Alias
- Field
- Strict
- Limit
- Page
- Order
- Group
- Having
- Join
- Union
- Distinct
- Lock
- Cache
- Comment
- FetchSql
- Force
- Partition
- Replace
- FailException
- Extra
- Duplicate
- Sequence
- Procedure
- View
- 聚合查詢
- 分頁查詢
- 時間查詢
- 高級查詢
- 子查詢
- 原生查詢
- 事務操作
- 存儲過程
- 查詢事件
- JSON字段
- 模型
- 定義
- 新增
- 更新
- 刪除
- 查詢
- 查詢范圍
- 只讀字段
- JSON字段
- 自動時間寫入
- 獲取器
- 修改器
- 搜索器
- 類型轉換
- 模型輸出
- 模型事件
- 虛擬模型
- 關聯
- 一對一關聯
- 一對多關聯
- 遠程一對多
- 遠程一對一
- 多對多關聯
- 多態一對多
- 多態一對一
- 關聯預載入
- 關聯統計
- 關聯輸出
- SQL監聽
- 緩存機制
- 字段緩存
- 查詢緩存
- 擴展
- 自定義查詢類
- 自定義數據庫驅動