php 查询方法all,获取多条:all静态方法
查詢多條數據:all( )方法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);
}all方法源碼與get源碼幾乎一樣,僅是最后調用的查詢方法不同:select($data)
3. 參數與返回值:參數:序號參數說明1數字/字符串主鍵列表
2查詢表達式支持所有查詢表達式
3閉包函數支持更多高級查詢語法返回值:數據集對象。
4. 實例演示我們仍以tp5_staff數據表為例
一、任務1:獲取tp5_staff表中:id等于1009和1010的記錄控制器:Index.php查詢條件以字符串方式給出:’1009,1010‘<?phpnamespace ?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的員工信息顯然,對于這樣需求,上面方法無能為力,只能通過構造查詢表達式來解決控制器:Index.php<?phpnamespace ?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個人的編號,姓名,年齡,工資信息。根據需求,查詢表達式已無法完成,必須借助連貫方法,就這要用到:閉包查詢控制器:Index.php<?phpnamespace ?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. 總結:all( )方法與查詢類的select方法的功能是一樣的,你完成可以認為這是省去了選擇數據表的select操作。其實我們將閉包查詢中的all( ),換成:select( )方法,查詢結果是一樣的$result?=?Staff::select($closure);
與$result?=?Staff::all($closure);
完全是等價的!為什么會是這樣的呢?Model類中并沒有select靜態方法呀!這就是__callStatic( )魔術方法的魔力發揮了作用!記不清的同學,請復習OOP編程總結章節。
總結
以上是生活随笔為你收集整理的php 查询方法all,获取多条:all静态方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 牙齿种植价格多少钱啊?
- 下一篇: php+原生代码+赋值,js重新赋值原生