## 查詢多條數據:all( )方法
>[info] all方法與前節課學習的get方法都是靜態方法,可用模型類直接訪問
#### 2. 源碼:
~~~
/**
* 查找所有記錄
* @access public
* @param mixed $data 主鍵列表或者查詢條件(閉包)
* @param array|string $with 關聯預查詢
* @param bool $cache 是否緩存
* @return static[]|false
* @throws exception\DbException
*/
public static function all($data = null, $with = [], $cache = false)
{
$query = static::parseQuery($data, $with, $cache);
return $query->select($data);
}
~~~
>[info] all方法源碼與get源碼幾乎一樣,僅是最后調用的查詢方法不同:select($data)
* * * * *
#### 3. 參數與返回值:
* 參數:
| 序號 | 參數 | 說明 |
| --- | --- | --- |
| 1 | 數字/字符串 | 主鍵列表 |
| 2| 查詢表達式 | 支持所有查詢表達式 |
| 3 | 閉包函數 | 支持更多高級查詢語法 |
* 返回值:數據集對象。
* * * * *
#### 4. 實例演示
>[info] 我們仍以tp5_staff數據表為例
一、任務1:獲取tp5_staff表中:id等于1009和1010的記錄
* 控制器:Index.php
> 查詢條件以字符串方式給出:’1009,1010‘
~~~
<?php
namespace app\index\controller;
//導入模型類
use app\index\model\Staff;
class Index {
public function index(){
//1.執行查詢,返回數據對象數組
$result = Staff::all('1009,1010');
//2.遍歷該數據對象數組:$result
//$data既是循環變量,也是其中一個數據對象
foreach ($result as $data){
//getData()可以獲取數據對象原始數據:$data屬性值
dump($data -> getData());
}
}
}
~~~
* all( ) 方法的主鍵列表:還可以用數組表示
~~~
//1.執行查詢,返回數據對象數組
$result = Staff::all([1009,1010]);
~~~
* 以上查詢方法,返回的SQL查詢語句都是一樣的:
~~~
SELECT * FROM `tp5_staff` WHERE `id` IN (1009,1010) ;
~~~
* * * * *
二、任務2:查詢表中年齡age大于30,并且工資salary大于800的員工信息
>[info] 顯然,對于這樣需求,上面方法無能為力,只能通過構造查詢表達式來解決
* 控制器:Index.php
~~~
<?php
namespace app\index\controller;
//導入模型類
use app\index\model\Staff;
class Index {
public function index(){
//1.構造查詢表達式
$map['age'] = ['>',30];
$map['salary'] = ['>',8000];
//2.執行查詢,返回數據對象數組
$result = Staff::all($map);
//3.遍歷該數據對象數組:$result
//$data既是循環變量,也是其中一個數據對象
foreach ($result as $data){
//getData()可以獲取數據對象原始數據:$data屬性值
dump($data -> getData());
}
}
}
~~~
* 對應的SQL語句:
~~~
SELECT * FROM `tp5_staff` WHERE `age` > 30 AND `salary` > 8000;
~~~
* 查詢結果如下:

* * * * *
三、任務3:在任務2的基礎上(age>30 AND salary>8000),我們又提出了三個需求:按工資排序,只輸出工資最高的3個人的編號,姓名,年齡,工資信息。
>[info] 根據需求,查詢表達式已無法完成,必須借助連貫方法,就這要用到:閉包查詢
* 控制器:Index.php
~~~
<?php
namespace app\index\controller;
//導入模型類
use app\index\model\Staff;
class Index {
public function index(){
//1.構造閉包函數
$closure = function ($query){
//1.設置字段別名
$field['id'] = '編號';
$field['name'] = '姓名';
$field['age'] = '年齡';
$field['salary'] = '工資';
//2.設置查詢表達式
$map['age'] = ['>',30];
$map['salary'] = ['>',8000];
//3.執行查詢
$query -> field($field) //限制顯示字段
-> where($map) //過濾查詢結果
-> order('salary desc') //按salary字段降序輸出
-> limit(3); //限制輸出數量
};
//2.執行閉包查詢,返回數據對象數組
$result = Staff::all($closure);
//3.遍歷該數據對象數組:$result
//$data既是循環變量,也是其中一個數據對象
foreach ($result as $data){
//getData()可以獲取數據對象原始數據:$data屬性值
dump($data -> getData());
}
}
}
~~~
* 查詢對應的SQL語句:
~~~
SELECT `id` AS `編號`,`name` AS `姓名`,`age` AS `年齡`,`salary` AS `工資` FROM `tp5_staff` WHERE `age` > 30 AND `salary` > 8000 ORDER BY salary desc LIMIT 3
~~~
* 瀏覽器查看:
~~~
array(4) {
["編號"] => int(1006)
["姓名"] => string(9) "西門慶"
["年齡"] => int(90)
["工資"] => float(20301)
}
array(4) {
["編號"] => int(1002)
["姓名"] => string(6) "幫主"
["年齡"] => int(255)
["工資"] => float(12345)
}
array(4) {
["編號"] => int(1028)
["姓名"] => string(6) "方方"
["年齡"] => int(90)
["工資"] => float(10877)
}
~~~
* 數據庫查詢結果:SQLPRO for MySQL工具

* * * * *
#### 5. 總結:
>[success] all( )方法與查詢類的select方法的功能是一樣的,你完成可以認為這是省去了選擇數據表的select操作。
* 其實我們將閉包查詢中的all( ),換成:select( )方法,查詢結果是一樣的
~~~
$result = Staff::select($closure);
~~~
與
~~~
$result = Staff::all($closure);
~~~
完全是等價的!
>[warning] 為什么會是這樣的呢?Model類中并沒有select靜態方法呀!這就是__callStatic( )魔術方法的魔力發揮了作用!記不清的同學,請復習OOP編程總結章節。
- 前言[隨時更新]
- 開發環境
- 1.Mac環境
- 2.windows環境
- 模型對象
- 1.創建模型對象
- 2.模型初始化
- 數據對象
- 1.定義數據對象
- 2.創建數據對象
- 1.data方法
- 2.setAttr方法
- 3.__set方法
- 4.查詢數據對象
- 1.getData方法
- 2.getAttr方法
- 3.__get方法
- OOP難點總結
- 1.get_class( )實例講解
- 2.get_called_class( )實例講解
- 3.__call( )實例講解
- 3.__callStatic( )實例講解
- 4.call_user_func_array函數[重點]
- 5.普通方法與靜態方法
- 6.在Model源碼中的應用
- 7.new static 延遲靜態綁定
- PHP標準化規范
- 查詢數據
- 1.獲取單條:get靜態方法
- 2.獲取單條:對象查詢
- 3.獲取多條:all靜態方法
- 4.獲取多條:對象查詢
- 5.獲取字段值:value方法
- 6.獲取列值:column方法
- 7.動態查詢:getBy字段名
- 8.助手函數:model查詢
- 9.加載器:Loader類查詢
- 10.數據庫與模型查詢對比
- 新增數據
- 1.sava方法
- 2.savaAll方法
- 3.create靜態方法
- 4.insert靜態調用
- 更新數據
- 1.單條更新:save方法
- 2.批量更新:saveAll方法
- 3.靜態更新:update方法
- 4.查詢類Query直接更新
- 5. 閉包更新
- 刪除數據
- 1.刪除當前記錄:delete
- 2.靜態條件刪除:destory
- 獲取器
- 1.模型方法:set屬性Attr
- 修改器
- 1.set屬性Attr
- 時間戳
- 1.MySQL中日期類型復習
- 2.時間戳功能詳解
- 軟刪除[重點]
- 1.traits詳解[選學內容]
- 2.SoftDelet類源碼分析
- 3. delete實例刪除
- 4.destroy條件刪除
- 5.restore恢復數據
- 類型轉換
- 1. 規則設置
- 2. 實例演示
- 查詢范圍
- 1. 基本概念
- 2.實例演示