1. 程式人生 > >動態查詢:getBy字段名

動態查詢:getBy字段名

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字段名