[TOC]
# AR模型
## findOne
AR模型的findOne這個靜態方法是用于查找數據并轉換成模型實例返回,它的參數有兩種表達方式:
1. 數據ID,就是主鍵
2. 條件數組,和yii\\db\\Query的where數組寫法一樣
相當于Query對象的one方法返回一條記錄的數組一樣,findOne就是返回一條記錄的對象,由于是對象,是對象就能有方法,有方法就能方便地執行save、delete等,以及封裝更多處理邏輯
## 字段賦值
如果數據表里有name字段,則可以直接操作模型的name屬性,像上面`$test2->name`這樣
還可以用數組語法操作,比如`$test['name'] = 'abc'; $test->save();`
## 轉成數組
Test::findOne這樣查出來是個對象,可是返回給前端的要是個數組咋辦,可以這樣:
~~~php
Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;
Yii::$app->response->data = $test->toArray();
~~~
用toArray能將數據庫相關的字段轉換成數組來返回
## 查詢多條記錄
將**findOne**改成`findAll`即可,參數和findOne一模一樣
它就相當于Query對象的all方法返回多條記錄的數組一樣,findAll就是返回多條記錄的模型數組
示例代碼:
~~~php
foreach(Test::findAll(['status' => 1]) as $test){
print_r($test->name, $test->age);
}
~~~
無條件findAll就傳個空數組吧,但不能不傳參數
## 批量更新數據
用`updateAll`方法:
~~~php
Test::updateAll(['name' => 'abc'], ['id' => $ids]);
//UPDATE test SET name = abc WHERE id in ($ids)
~~~
第一個參數是要更新的字段和值
第二個參數就是條件,當然還是跟Query的where方法參數一樣啦親
不用AR模型實現更新數據的話,那就要這樣來寫代碼了:
~~~php
Yii::$app->db->createCommand()->update(Test::tableName(), $data, ['id' => $ids])
~~~
那至少,用AR模型寫更新的代碼會短一些,但當然AR不僅僅只是為了縮短代碼的書寫而存在……
## 實現更新 +1 之類的
要實現這樣更新文章點擊數量的話:(`UPDATE xxxTable SET view_count = view_count + 1`)
用`updateCounters`這個方法:
~~~php
$article = Article::findOne(1);
$article->updateCounters(['view_count' => 1]);
~~~
key就是要累加的字段,value就是要累加的值,如果是`'view_count' => 3`那自然就是`SET view_count = view_count + 3`了
## 批量刪除數據
一樣的思想,就是`deleteAll`方法:
~~~php
Test::deleteAll(['id' => $ids]);
//DELETE FROM test WHERE id in($ids)
~~~
參數就是刪除的條件
# AR查詢器
AR模型查詢的時候除了有`模型::findOne(條件)`和`模型::findAll(條件)`以外,第三種常見的使用方式就是先通過find方法創建一個[AR查詢器](http://www.yiichina.com/doc/api/2.0/yii-db-activequery)(yii\\db\\ActiveQuery),代碼就是這樣的`模型::find()->where($condition)...->all()`
先試一下:
~~~php
$testList = Test::find()->where(['type' => 3])->all();
foreach($testList as $test){
echo $test->id;
}
~~~
這樣find,where,all后返回的也是一個數組,而每個元素都是一個Test模型實例,實際上是跟`Test::findAll(['type' => 3])`是等效的
# find方法存在的意義
find方法其實不做任何實際的查詢,它只是創建一個查詢器,你可以理解成這樣一個思想:
~~~php
public static function find(){
$query = new \yii\db\ActiveQuery();
$query->from(static::tableName());
return $query;
}
~~~
這里它返回的[ActiveQuery](http://www.yiichina.com/doc/api/2.0/yii-db-activequery)也是一個查詢器,跟[yii\\db\\Query](http://www.yiichina.com/doc/api/2.0/yii-db-query)這個查詢器是同一性質的東西
區別是:**Query只查出純數組形式的結果集,而ActiveQuery是查出對象形式的數據模型對象實例結果集**,可謂是一個輕量級,一個重量級
其中ActiveQuery(好了我以后都簡稱為AR查詢器了)也能像Query一樣where() select() limit() orderBy one() all()....
但是不能from(),實際上AR查詢器并沒有from方法讓我們去設定表名(所以其實我上面的代碼是無效的!它只是一個思想演示),它是通過別的方法與一個模型的表進行綁定的,我就不說那么復雜了
好了既然返回一個查詢器,就可以想像到我們可以自由地控制一些查詢參數來實現更多豐富的查詢,這就是**find方法的存在意義**,也就是AR查詢器的存在意義,比如要查詢最高分的前10名用戶:
~~~php
$users = User::find()
->where(['sex' => 1])
->orderBy(['score' => SORT_DESC])
->limit(10)
->all();
~~~
- 目錄
- 配置
- 簡介
- 別名
- gii
- 配置項
- 模型
- 簡介
- 增刪改查
- AR和model
- 模型事件
- 場景
- query查詢
- 增刪改
- AR查詢器
- 模型關系定義
- AR模型連表查詢
- fields
- where拼接
- 模塊
- 創建模塊
- 控制器
- 表單
- 跳轉
- 響應
- 驗證器
- Action
- 組件
- url
- 分頁
- 驗證碼
- 緩存
- 文件上傳
- 預啟動組件
- 事件
- 自定義組件
- redis
- 日志
- 行為
- cookie和session
- 基礎知識
- 創建一個類
- 配置一個類
- object基類
- component組件類特性
- phpstorm無法更改php等級
- url地址美化
- 過濾器
- 請求處理
- 請求組件
- 響應組件
- header
- 用戶登錄
- 實現IdentityInterface接口
- 登錄
- 自動檢測登錄
- 獲取用戶信息
- 訪問行為追蹤
- phpstorm+postman斷點調試