動態查詢:getBy字段名
阿新 • • 發佈:2017-12-11
app 小寫 rto ram () 如果 任務 ret pub
http://www.php.cn/php/php-getBy.html
根據字段名動態查詢:getBy字段名( )
該方法很有意思,手冊的說得很簡略,我們根據源碼來好好說道說道~~
1. 功能:根據字段值查詢記錄,且僅返回一條記錄
2. 源碼:/thinkphp/library/think/db/Query.php
您可能感到奇怪,我們不是在學習模型嗎?怎麽又折騰回了數據庫了?原因很簡單:這個動態查詢是通過Query類的構造方法實現的:
- Query.php 構造方法源碼:
/** * 利用__call方法實現一些特殊的Model方法 * @access public * @param string $method 方法名稱 * @param array $args 調用參數 * @return mixed * @throws DbException * @throws Exception */public function __call($method, $args){if (strtolower(substr($method, 0, 5)) == ‘getby‘) {// 根據某個字段獲取記錄$field = Loader::parseName(substr($method, 5));$where[$field] = $args[0];return $this->where($where)->find(); } elseif (strtolower(substr($method, 0, 10)) == ‘getfieldby‘) {// 根據某個字段獲取記錄的某個值$name = Loader::parseName(substr($method, 10));$where[$name] = $args[0];return $this->where($where)->value($args[1]); } else {throw new Exception(‘method not exist:‘ . __CLASS__ . ‘->‘ . $method); } }
- 與getBy字段名( )相關的代碼段:
註釋是本人所加,源代碼中並沒有
//去掉getBy獲取字段名,並轉為小寫後,判斷是否存在字段名字符串 if (strtolower(substr($method, 0, 5)) == ‘getby‘) {// 根據某個字段獲取記錄$field = Loader::parseName(substr($method, 5));//將getBy***()的參數做為where方法的參數$where[$field] = $args[0];//返回查詢結果:只返回單條滿足條件的記錄return $this->where($where)->find();
3. 實例演示:
- 老規矩,先創建一個模型類:/application/index/mode/Staff.php
<?php namespace app\index\model;//導入模型類use think\model;class Staff extends model {//自定義模型類代碼}
一、任務1:查詢姓名name等於"李雲龍"的記錄
- 控制器:/application/index/controller/Index.php
<?phpnamespace app\index\controller;//導入模型類use app\index\model\Staff;class Index { public function index(){ //1.獲取name=‘李雲龍‘的【數據對象】 $result = Staff::getByName(‘李雲龍‘); //2.獲取數據對象原始數據 $data = $result -> getData(); //3.查看結果 dump($datas); } }
- 查看結果:
array(7) { ["id"] => int(1011) ["name"] => string(9) "李雲龍" ["sex"] => int(1) ["age"] => int(49) ["salary"] => float(10350) ["dept"] => int(1) ["hiredate"] => string(10) "2005-10-20"}
如果查詢其它字段,只需要修改一下方法名稱中的字段名部分即可,如查詢年齡=30歲,方法名就是:getByAge(30)。因為方法名稱因字段名稱變化而變化,所以要動態查詢。
二、任務2:查詢姓名中含有:‘大‘字的員工信息
getBy字段名( )方法參數是否支持查詢表達式呢?手冊並未提及,但是看了源碼後,發現有限支持:數組式查詢表達式,如:[ ‘between‘,[1010,1020] ] 或者:[ ‘>‘,1020 ]
- 控制器:/application/index/controller/Index.php
<?phpnamespace app\index\controller;//導入模型類use app\index\model\Staff;class Index { public function index(){ //1.獲取name中包含"大"字符的記錄,返回【數據對象】 $result = Staff::getByName([‘like‘,‘%大%‘]); //2.獲取數據對象原始數據 $data = $result -> getData(); //3.查看結果 dump($data); } }
- 查看結果
array(7) { ["id"] => int(1024) ["name"] => string(9) "魯大師" ["sex"] => int(0) ["age"] => int(60) ["salary"] => float(1300) ["dept"] => int(2) ["hiredate"] => string(10) "2012-09-09"}
4. 總結:
盡管動態查詢方法的參數支持查詢表達式,但不要比較或範圍表達式,因為僅返回第一條滿足條件記錄,通常是沒有意義的。模糊查詢有時很有用,但同樣也僅獲取結果集的首條記錄。
建議用字段值,進行精準查詢,不用要查詢表達式。
動態查詢:getBy字段名