thinkphp5 model 模型與Db

新增更新都是save、saveAll  怎麼識別他們

  • 實例化模型後調用save方法表示新增;
  • 查詢數據後調用save方法表示更新;
  • save方法傳入更新條件後表示更新;

isUpdate(true):強制更新

isUpdate(false):強制新增

 

新建模型

一、手動建立 php

    1. app的模塊文件夾下新建model文件夾
    2. 新建文件user.php。最好名字和表名對應
    3. 寫代碼
<?php
namespace app\admin\model;
use think\Model;
class User extends Model
{
        //若是表名和文件名不是對應的,用下面代碼修改
        protected $table = 'think_user';
}

二、用命令html

>php think make:model admin/Blogmysql

 

模型實例化

一、用靜態方法sql

use app\admin\model\User;
 $li= User::get(1);

二、用加載類(單例)  thinkphp

use think\Loader;
$user= Loader::model('User');
//某些路由可能致使獲取不到模塊哦(如這條路由別名Route::alias('showindex','\app\test\controller\Index');),因此儘可能將參數多加個模塊或者直接類全名
$user= Loader::model('admin/user');
$user= Loader::model('app\admin\model\User');
$li= $user::get(1);

三、用系統方法至關於D()封裝的(Loader::model()數據庫

$user= model('User');
$li= $user::get(1);

四、實例化模型json

use app\admin\model\User;
$user = new User;
$user->name= 'thinkphp';
$user->save();

數組

獲取單條數據緩存

//直接實例化model類
$user = new User();
$user->where('name', 'thinkphp')->find();
或者
//取出主鍵爲1的數據
$user = User::get(1);
echo $user->name;

// 使用數組查詢
$user = User::get(['name' => 'thinkphp']);

// 使用閉包查詢
$user = User::get(function($query){
    $query->where('name', 'thinkphp');
});
echo $user->name;//若是你是在模型內部,請不要使用的方式來獲取數據,請使用 替代$this->name$this->getAttr('name')

獲取多個數據(5.0.4+支持在模型中設置resultSetType返回數據集對象的名稱)

$user = new User();
// 查詢數據集
$user->where('name', 'thinkphp')
    ->limit(10)
    ->order('id', 'desc')
    ->select();
或者

// 根據主鍵獲取多個數據
$list = User::all('1,2,3');
// 或者使用數組
$list = User::all([1,2,3]);
foreach($list as $key=>$user){
    echo $user->name;
}
// 使用數組查詢
$list = User::all(['status'=>1]);
// 使用閉包查詢
$list = User::all(function($query){
    $query->where('status', 1)->limit(3)->order('id', 'asc');
});
foreach($list as $key=>$user){
    echo $user->name;
}

 

獲取某個字段或者某個列的值

 

// 獲取某個用戶的積分(某個字段的值單個值)
User::where('id',10)->value('score');
// 獲取某個列的全部值(多個值)
User::where('status',1)->column('name');
// 以id爲索引
User::where('status',1)->column('name','id');
User::where('status',1)->column('id,name'); // 同tp3的getField

安全

添加一條數據save

$user           = new User;
$user->name     = 'thinkphp';
$user->email    = 'thinkphp@qq.com';
$user->save();

或者

$user = new User;
$user->data([
    'name'  =>  'thinkphp',
    'email' =>  'thinkphp@qq.com'
]);
$user->save();

又或者
$user = new User([
    'name'  =>  'thinkphp',
    'email' =>  'thinkphp@qq.com'
]);
$user->save();



若是須要過濾非數據表字段的數據,可使用:

$user = new User($_POST);
// 過濾post數組中的非數據表字段數據
$user->allowField(true)->save();
若是你經過外部提交賦值給模型,而且但願指定某些字段寫入,可使用:

$user = new User($_POST);
// post數組中只有name和email字段會寫入
$user->allowField(['name','email'])->save();

獲取自增id

$user           = new User;
$user->name     = 'thinkphp';
$user->email    = 'thinkphp@qq.com';
$user->save();
// 獲取自增ID  與表中的id名對應
echo $user->user_id;

注意不要在同一個實例裏面屢次新增數據,若是確實須要屢次新增,那麼能夠用下面的方式

$user           = new User;
$user->name     = 'thinkphp';
$user->email    = 'thinkphp@qq.com';
$user->save();
$user->name     = 'onethink';
$user->email    = 'onethink@qq.com';
// 第二次開始必須使用下面的方式新增
$user->isUpdate(false)->save();

 

新增多條數據saveAll

$user = new User;
$list = [
    ['name'=>'thinkphp','email'=>'thinkphp@qq.com'],
    ['name'=>'onethink','email'=>'onethink@qq.com']
];
$user->saveAll($list);
//saveAll方法新增數據返回的是包含新增模型(帶自增ID)的數據集(數組)。V5.0.13+版本開始,saveAll方法的返回類型受模型的resultSetType屬性影響(可能返回數據集對象)

aveAll方法新增數據默認會自動識別數據是須要新增仍是更新操做,當數據中存在主鍵的時候會認爲是更新操做,若是你須要帶主鍵數據批量新增,可使用下面的方式:
$user = new User;
$list = [
    ['id'=>1, 'name'=>'thinkphp', 'email'=>'thinkphp@qq.com'],
    ['id'=>2, 'name'=>'onethink', 'email'=>'onethink@qq.com'],
];
$user->saveAll($list, false);

助手函數

// 使用model助手函數實例化User模型
$user = model('User');
// 模型對象賦值
$user->data([
    'name'  =>  'thinkphp',
    'email' =>  'thinkphp@qq.com'
]);
$user->save();

或者進行批量新增(saveAll):
$user = model('User');
// 批量新增
$list = [
    ['name'=>'thinkphp','email'=>'thinkphp@qq.com'],
    ['name'=>'onethink','email'=>'onethink@qq.com']
];
$user->saveAll($list);

靜態方法

還能夠直接靜態調用create方法建立並寫入:

$user = User::create([
    'name'  =>  'thinkphp',
    'email' =>  'thinkphp@qq.com'
]);
echo $user->name;
echo $user->email;
echo $user->id; // 獲取自增ID

改  注意新增和更新都是save 有id就更新

 先查找在修改 (get和find返回的都是是當前模型的對象實例)

  //更新id爲1的數據(先查出id位1的數據,在save更新)
  $user = User::get(1);
  $user->name     = 'thinkphp';
  $user->email    = 'thinkphp@qq.com';
  $user->save();
或者:
  $user=new User;// or $user= Loader::model('User'); or $user= model('User');
  $data=$user->where('id', '1')->find();
  $data->name = 'thinkphp111';
  $data->save();

直接更新數據 

model('User')->save(array $data,array $where)

$user = new User;
// save方法第二個參數爲更新條件
$user->save([
    'name'  => 'thinkphp',
    'email' => 'thinkphp@qq.com'
],['id' => 1]);

過濾非數據表字段的數據allowField(true or 'field')

 

直接更新post或者get數據須要去掉post/get中不是數據表字段的參數

$user = new User();
// 過濾post數組中的非數據表字段數據
$user->allowField(true)->save($_POST,['id' => 1]);
// post數組中只有name和email字段會寫入
$user->allowField(['name','email'])->save($_POST, ['id' => 1]);

 

閉包更新 (能夠調用多個更新條件)

//能夠經過閉包函數使用更復雜的更新條件,例如:
$user = new User;
$user->save(['name' => 'thinkphp'],function($query){
    // 更新status值爲1 而且id大於10的數據
    $query->where('status', 1)->where('id', '>', 10);
});

 

經過數據庫類更新數據update()方法(必要時,這個不能沒法使用模型的事件功能)

$user = new User;
$user->where('id', 1)->update(['name' => 'thinkphp']);
//若是傳入update的數據包含主鍵的話,能夠無需使用where方法。
$user->update(['id' => 1, 'name' => 'thinkphp']); 
或者(靜態方法)
User::where('id', 1) ->update(['name' => 'thinkphp']);
//若是傳入update的數據包含主鍵的話,能夠無需使用where方法。
User::update(['id' => 1, 'name' => 'thinkphp']);

批量更新:saveAll(存在主鍵的二維數組) 無主鍵須要foreach循環更新

$user = new User;
$list = [
    ['id'=>1, 'name'=>'thinkphp', 'email'=>'thinkphp@qq.com'],
    ['id'=>2, 'name'=>'onethink', 'email'=>'onethink@qq.com']
];
$user->saveAll($list);

//5.013+版本可使用isUpdate()方法對saveAll強制更新(尤爲適合於複合主鍵的狀況) save則是5.0+
$user->isUpdate()->saveAll($list);

 

$user = User::get(1);
$user->delete();

根據主鍵刪除
User::destroy(1);
// 支持批量刪除多個數據
User::destroy('1,2,3');
// 或者
User::destroy([1,2,3]);


條件刪除

// 刪除狀態爲0的數據
User::destroy(['status' => 0]);
還支持使用閉包刪除,例如:

User::destroy(function($query){
    $query->where('id','>',10);
});
或者經過數據庫類的查詢條件刪除

User::where('id','>',10)->delete();

 Model屬性:    // 數據庫查詢對象池    protected static $links = [];

// 數據庫配置
    protected $connection = [];
    // 父關聯模型對象
    protected $parent;
    // 數據庫查詢對象
    protected $query;
    // 當前模型名稱(根據模型文件的位置和類名自動生成,查詢會查詢table屬性,table爲空時自動拼接表名,name和table屬性都出現的話已table爲準)
    protected $name='user';
    // 數據表名稱
    protected $table='think_user';
注意:name和table都是數據表名只是設置的時候name不用加前綴,而table須要加上前綴 當mode文件的位置不符合規範就用他們
// 當前類名稱 protected $class; // 回調事件 private static $event = []; // 錯誤信息 protected $error; // 字段驗證規則 protected $validate; // 數據表主鍵 複合主鍵使用數組定義 不設置則自動獲取 protected $pk; // 數據表字段信息 留空則自動獲取 protected $field = []; // 數據排除字段 protected $except = []; // 數據廢棄字段 protected $disuse = []; // 只讀字段 protected $readonly = []; // 顯示屬性 protected $visible = []; // 隱藏屬性 protected $hidden = []; // 追加屬性 protected $append = []; // 數據信息 protected $data = []; // 原始數據 protected $origin = []; // 關聯模型 protected $relation = []; // 保存自動完成列表 protected $auto = []; // 新增自動完成列表 protected $insert = []; // 更新自動完成列表 protected $update = []; // 是否須要自動寫入時間戳 若是設置爲字符串 則表示時間字段的類型 protected $autoWriteTimestamp; // 建立時間字段 protected $createTime = 'create_time'; // 更新時間字段 protected $updateTime = 'update_time'; // 時間字段取出後的默認時間格式 protected $dateFormat; // 字段類型或者格式轉換 protected $type = []; // 是否爲更新數據 protected $isUpdate = false; // 是否使用Replace protected $replace = false; // 是否強制更新全部數據 protected $force = false; // 更新條件 protected $updateWhere; // 驗證失敗是否拋出異常 protected $failException = false; // 全局查詢範圍 protected $useGlobalScope = true; // 是否採用批量驗證 protected $batchValidate = false; // 查詢數據集對象 protected $resultSetType; // 關聯自動寫入 protected $relationWrite; /** * 初始化過的模型. * * @var array */ protected static $initialized = []; /** * 是否從主庫讀取(主從分佈式有效) * @var array */ protected static $readMaster;

 

 

Model公共方法:

_construct
getQuery(false)       獲取當前模型的查詢對象
db(true,true) 獲取當前模型的數據庫查詢對象
setParent($model)     設置父關聯對象
getParent()           獲取父關聯對象
data($data,$value=null);  設置數據對象值(即設置model的data屬性的值)參數爲字符串則追加data,不然就銷燬data在賦值
getData($field_name)                 獲取對象的原始數據(不填參數默認獲取所有)  如:$model->find(1)->getData() or $model->select()[0]->getData()返回單條表數據數組  
isAutoWriteTimestamp($auto) 動態設置是否須要自動寫入時間字段(值爲boolean)
force(true)    更新是否強制寫入數據 而不作比較
setAttr($name,$value,$data=[]) 修改器 設置數據對象值
getRelation(關聯方法名)                      獲取當前模型的關聯模型數據
setRelation($name,$value)                  設置關聯數據對象值
getAttr($name) 獲取器 獲取數據對象的值
append(['field_name'=>'value'],false)         設置須要追加的輸出屬性
appendRelationAttr($relation, $append)     設置附加關聯對象的屬性
hidden(['field_name1','field_name2',...],false) 設置須要隱藏的輸出屬性
visible(['field_name1',...],false) 設置須要輸出的屬性
toArray() 轉換當前模型對象爲數組
toJson() 轉換當前模型對象爲JSON字符串
removeRelation($collection)              (參數爲array|\think\Collection $collection)移除當前模型的關聯屬性
toCollection()                                轉換當前模型數據集爲數據集對象
together($relation)                           關聯數據一塊兒更新
getPk($name='')                                         根據模型名獲取模型對象的主鍵
save($data = [], $where = [], $sequence = null) 新增或修改
getChangedData()                                獲取變化(即將要修改)的數據 並排除只讀數據
setInc($field, $step = 1, $lazyTime = 0) 自增
setDec($field, $step = 1, $lazyTime = 0) 自減
saveAllsaveAll($dataSet, $replace = true) 保存多個數據到當前數據對象
allowField($field) 設置容許寫入的字段
except($field) 設置排除寫入的字段
readonly($field)                             設置只讀字段
isUpdate($update = true, $where = null) 是否爲更新數據 
delete 刪除當前的數據
auto($fields)                                  設置自動完成的字段( 規則經過修改器定義)
validate($rule = true or ruleArr, $msg = [], $batch = false) 設置字段驗證
validateFailException(true)   設置驗證失敗後是否拋出異常
getError()                           返回模型的錯誤信息
::event($event, $callback, $override = false)      註冊回調方法
::create 新增
::update 修改
::get 獲取單條
::all 獲取多條
::destroy 刪除
::scope(string|array|\Closure $name)                     命名範圍
::useGlobalScope($use)                                   設置是否使用全局查詢範圍   當爲true時即設置useGlobalScapeshu屬性爲true 當調用model不存在的方法時會直接查找數據庫查詢類是否存在,存在就調用
::has($relation, $operator = '>=', $count = 1, $id = '*')   根據關聯條件查詢當前模型
::hasWhere($relation, $where = [], $fields = null)          根據關聯條件查詢當前模型
relationQuery($relations)                                查詢當前模型的關聯數據
eagerlyResultSet(&$resultSet, $relation)                 預載入關聯查詢 返回數據集
eagerlyResult(&$result, $relation)                       關聯統計
relationCount
hasOne($model, $foreignKey = '', $localKey = '', $alias = [], $joinType = 'INNER') HAS ONE 關聯定義
belongsTo($model, $foreignKey = '', $localKey = '', $alias = [], $joinType = 'INNER') BELONGS TO 關聯定義
hasMany($model, $foreignKey = '', $localKey = '') HAS MANY 關聯定義
hasManyThrough($model, $through, $foreignKey = '', $throughKey = '', $localKey = '') HAS MANY 遠程關聯定義
belongsToMany($model, $table = '', $foreignKey = '', $localKey = '') BELONGS TO MANY 關聯定義
morphMany($model, $morph = null, $type = '') MORPH  MANY 關聯定義
morphOne($model, $morph = null, $type = '') MORPH  One 關聯定義 morphTo($morph = null, $alias = []) MORPH TO 關聯定義
__call               此函數的做用是調用數據庫的方法(當全局查詢範圍開啓時)
__callStatic         做用同上
__set
__get
__isset
__unset
__toString
jsonSerialize()
offsetSet($name,$value)
offsetExists($name)
offsetUnset($name)
offsetGet($name)
__wakeup()   解序列化後處理就一行代碼
readMaster(false) 是否從主庫讀取數據(主從分佈有效)
newInstance($data,$isUpdate,$where) 建立新的模型實例
replace($replace = true) 新增數據是否使用Replace
protected (都是model內部方法)
buildQuery() 建立模型的查詢對象
initialize() 初始化模型
init() 初始化處理 適合在子類重寫
autoWriteTimestamp($name時間戳字段名) 自動寫入時間戳
writeTransform($value, $type) 寫入數據 類型轉換
readTransform($value, $type) 數據讀取 類型轉換
getRelationData(Relation $modelRelation) 獲取關聯模型數據
parseAttr($attrs, &$result, $visible = true) 解析隱藏及顯示屬性
subToArray($model, $visible, $hidden, $key) 轉換子模型對象
isPk($key) 判斷一個字段名是否爲主鍵字段
checkAllowField($auto = [])
autoRelationUpdate($relation)
getWhere()獲取更新條件
autoCompleteData($auto = []) 數據自動完成
validateData($data, $rule = null, $batch = null) 自動驗證數據
trigger($event, &$params) 觸發事件
::parseQuery(&$data, $with, $cache) 分析查詢表達式
parseModel($model) 解析模型的完整命名空間
getForeignKey($name) 獲取模型的默認外鍵名
//模型事件快捷方法
beforeInsert($callback, $override = false)
afterInsert($callback, $override = false)
beforeUpdate($callback, $override = false)
afterUpdate($callback, $override = false)
beforeWrite($callback, $override = false)
afterWrite($callback, $override = false)
beforeDelete($callback, $override = false)
afterDelete($callback, $override = false)

 Model select查出來的數據是數組套對象,咱們不能直接使用toArray()方法,而是要遍歷出數據在轉數組 模型默認的返回類型時array  

數據集:collection

當查詢的數據轉爲數據集後 不論是find仍是select查詢出來的調用toArray後直接所有轉爲數組,超級棒 不像array類型還夾雜着對象 

 

若是是數據集查詢的話有兩種狀況,因爲默認的數據集返回結果的類型是一個數組,所以沒法調用toArray方法,必須先轉成數據集對象而後再使用toArray方法,系統提供了一個collection助手函數實現數據集對象的轉換

助手函數collection($data)

 

        $products=ProductModel::getMostRecent($count);
        dump(collection($products)); //注意返回類型爲array時纔會轉換成數據集不然會報錯

 

 

 

2當前模型能夠定義屬性

 protected $resultSetType = 'collection';//查詢結果必定是數據集

三、數據庫配置直接array該數據集  'resultset_type'  => 'collection',

數據集臨時隱藏字段超級好用!!!

轉換成數據集後 檢查數據庫查詢數據是否爲空則不能使用if(!result){} 而是

if($result->isEmpty()){}

 

 

 

修改器:當調用修改器做用的那個字段時觸發:格式 在model 中定義get+首字母大寫的字段+Attr($value[,$data]);

 

class Test extends Model{

        public function getStatusAttr($value,$data)
        {
            $status = [0=>'禁用',1=>'正常'];
                    return $status[$value];
        }
}

//控制器調用(任何地方調用都行)
$testData=\app\index\model\Test::get(1);
$status=$tstData->status;//輸出正常
//or
$test=new app\index\model\Test;
$testData=$test->select();
$status=$testData[0]->status;//輸出正常

 

修改器:和獲取器同樣 只是在修改做用的字段時觸發

class Test extends Model{

        public function setNameAttr($value,$data)
        {        
            
            return strtolower($value);
        }

        public function setEmailAttr($value,$data)
        {        
            return strtolower($value);
        }
}


$testmodel=new \app\index\model\Test;
$testmodel->save(['name'=>'LICHIHUA','email'=>'WOLICHIHUA2011@163.COM'],['id'=>2]);    

自動添加和更新時間

model模型文件中添加:

protected $autoWriteTimestamp = true;// 開啓自動寫入時間戳字段(識別爲int 對照本身的字段格式)    (支持int、datetime、timestamp、true、false)  
// 定義時間戳字段名
protected $createTime = 'create_at';//默認create_time
protected $updateTime = 'update_at';//默認update_time      false則是關閉自動寫入update時間字段

全局設置:

數據庫配置文件中添加:

// 開啓、關閉自動寫入時間戳字段(int、datetime、timestamp、true、false)
 'auto_timestamp' => 'datetime',

其餘屬性:

class User extends Model
{
        //只讀字段,更新時排除列出的字段  
    protected $readonly = ['name','email'];

        //類型轉換(將數據庫查出的字段自動進行轉換)
        protected $type = [
            'status'    =>  'integer',
            'score'     =>  'float',
            'birthday'  =>  'datetime',//timestamp
            'info'      =>  'array', 
            //integer、float、boolean、array、object、serialize、json、timestamp、datetime
    ];
 
}

自動完成

class Test extends Model{
    //寫入(新增和修改)
    protected $auto = [];
    //新增
    protected $insert = ['ip','status' => 1];
    //修改
    protected $update = ['login_ip'];  


    protected function setIpAttr()
    {
        return request()->ip();
    }

     protected function setLoginIpAttr()
    {
        return request()->ip();
    }

查詢範圍 scop

model('user')->scop('thinkphp')->select();  會調用mode裏自定義的scopeThinkphp($query)方法

 

class User extends Model{

    protected function scopeThinkphp($query)
   {
        $query->where('name','thinkphp')->field('id,name');
    }
    
    protected function scopeAge($query)
    {
        $query->where('age','>',20)->limit(10);
    }    
}

//調用
model('user')->scop('thinkphp')->select();
model('user')->scop('thinkphp,age')->select();
 

模型分層和控制器分層用法同樣的

 模型關聯

 ORM(對象關係映射)model就是對orm的實現  通常中小型項目用這個就行了 大型的估計就須要原生的sql好優化

 模型之with()關聯預載入

 thinkphp5 with關聯預載入

 

 

 

 

 

 

 

數據庫:

\think\Db的__callStatic方法調用自身的connect方法得到config配置對應的驅動數據庫實例如:\think\db\connector\Mysql

//\think\Db::table('think_user'); 則 下面調用的是
//self::connect()->table('think_user') 等價於
//new \think\db\builder\Mysql()->table(); 繼承至Connection.php
//而table方法是Query.php裏的
//這個Query類是何時怎麼加載上的?
//Connection.php有個__construct 和 __call
//當調用Mysql(Connection)類裏的不存在的方法時__call調動getQuery實例化獲取新的查詢對象 而實例化的類是__construct時獲取的
//即Db::table實際調用的是Query類的table方法

原生查詢:

//查詢操做
Db::query('select * from think_user where id=?',[8]);
//or
Db::query('select * from think_user where id=:id',['id'=>8]);
//寫入操做
Db::execute('insert into think_user (id, name) values (?, ?)',[8,'thinkphp']);
//or
Db::execute('insert into think_user (id, name) values (:id, :name)',['id'=>8,'name'=>'thinkphp']);

可使用多個數據庫鏈接,使用
Db::connect($config1)->query('select * from think_user where id=:id',['id'=>8]);

//是在config.php配置的?額外數據庫配置參數
/數據庫配置1
'db_config1' => [
    // 數據庫類型
    'type'        => 'mysql',
    // 服務器地址
    'hostname'    => '127.0.0.1',
    // 數據庫名
    'database'    => 'thinkphp',
    // 數據庫用戶名
    'username'    => 'root',
    // 數據庫密碼
    'password'    => '',
    // 數據庫編碼默認採用utf8
    'charset'     => 'utf8',
    // 數據庫表前綴
    'prefix'      => 'think_',
],
//數據庫配置2
'db_config2' => 'mysql://root:1234@localhost:3306/thinkphp#utf8';

實例化數據庫:

//table方法必須指定完整的數據表名
$DB=Db::table('think_user')
//或者
$DB=db('user');助手函數


//數據庫配置文件定義了後綴或者數據表無後綴則可用
$DB=Db::name('user')

閉包查詢;

Db::select(function($query){
    $query->table('think_user')->where('status',1);
});

查:

find  返回數據或者null

select 返回數據或空數組

增長;

insert($data);返回插入成功的條數

insertGetId($data);返回插入成功後的id

insertAll( $data)插入多條記錄,返回插入成功的條數

刪除:

delete()

修改:

update   update 方法返回影響數據的條數,沒修改任何數據返回 0

更新某個字段的值

Db::table('think_user')->where('id',1)->setField('name', 'thinkphp');

自增或自減一個字段的值  setInc/setDec 如不加第二個參數,默認值爲1   setInc/setDec 方法返回影響數據的條數

db('user')->where('id',1)->update(['name' => 'thinkphp']);
// 更新某個字段的值
db('user')->where('id',1)->setField('name','thinkphp');
// 自增 score 字段
db('user')->where('id', 1)->setInc('score');
// 自減 score 字段
db('user')->where('id', 1)->setDec('score');
// 獲取`think_user`表全部信息
Db::getTableInfo('think_user');

鏈式操做

全部的連貫操做都返回當前的模型實例對象(this),其中帶*標識的表示支持屢次調用。

where*                           and查詢(數組、字符串、對象)
whereOr* or查詢(數組、字符串、對象) table table('前綴_表名,[前綴_表名,...]') or table(array['think_user'=>'user','think_role'=>'role']); or table('__表名(大寫)__')這種方式會自動獲取表名的前綴 alias 設置別名 table('dl_user)->alias('u') 多個用數組方式alias(array('dl_user'=>'u','di_role'=>'r')); field* 指定數據表操做字段 field('id,username as name,age') or field(array('id','username'=>'name',age)) order* order('id desc,age') or order(array('id'=>'desc','age')) limit limit(10) limit(11,25) page page(第幾頁,顯示多少條) group having
join* union* 用於對查詢的union支持(字符串、數組、對象) distinct 返回惟一不一樣的值 distinct(true) lock 用於數據庫的鎖機制 cache 用於查詢緩存 comment fetchSql(true) 直接反返回sql 而不是結果 force*(索引名) 強制使用索引 bind* partition 用於設置分表信息(數組or字符串) strict 用於設置是否嚴格檢測字段名是否存在(布爾) failException 用於設置沒有查詢到數據是否拋出異常(布爾)
wheretime* 用於時間日期的快捷查詢(字符串)
view* 視圖查詢
relation* 用於關聯查詢
with* 用於關聯預載入
master 用於設置主服務器讀取數據(布爾)
sequence 用於設置Pgsql的自增序列名(其餘sql無用?)

 

 

查詢表達式

where('字段名','表達式','查詢條件');
whereOr('字段名','表達式','查詢條件');

 

 

數操做函數:

外部可訪問
Db: static connect($config = [], $name = false) [Connection]   調用的是Connection下的connect方法
static clear() [void]    清除鏈接實例

connector/Mysql extends Connection:
getFields($tableName) [array]     取得數據表的字段信息
getTables($dbName = '')[array]   取得數據庫的表信息


Connection:
getBuilder()[array]    獲取當前鏈接器類對應的Builder類 
fieldCase($info_arr)[array]  對返數據表字段信息進行大小寫轉換出來
getConfig($config = '')[mixed]    獲取數據庫的配置參數
setConfig($config, $value = '')[void]    設置數據庫的配置參數
connect(array $config = [], $linkNum = 0, $autoConnection = false)[PDO]    鏈接數據庫方法
free()[???]  釋放查詢結果
getPdo()[PDO|false]  獲取PDO對象
query($sql, $bind = [], $master = false, $pdo = false)[mixed]   執行查詢 返回數據集
execute($sql, $bind = [], Query $query = null)[int]    執行語句
getRealSql($sql, array $bind = [])[string]    根據參數綁定組裝最終的SQL語句 便於調試

transaction($callback)[mixed]    執行數據庫事務
startTrans()[bool|mixed]    啓動事務
commit()[void]    用於非自動提交狀態下面的查詢提交
rollback()[void]    事務回滾

batchQuery($sqlArray = [], $bind = [], Query $query = null)[boolean]   批處理執行SQL語句   批處理的指令都認爲是execute操做
getQueryTimes($execute = false)[integer]    得到查詢次數
getExecuteTimes()[integer]    得到執行次數
close()[Connection自身]    關閉數據庫(或者從新鏈接)
getLastSql()[string]    獲取最近一次查詢的sql語句
getLastInsID($sequence = null)[string]    獲取最近插入的ID
getNumRows()[integer]    獲取返回或者影響的記錄數
getError()[string]    獲取最近的錯誤信息
quote($str, $master = true)[string]    SQL指令安全過濾
listen($callback)[void]    監聽SQL執行



Query類
getConnection()[Connection類]    獲取當前的數據庫Connection對象
connect($config)[Query]  切換當前的數據庫鏈接
getModel()[Model|null]    獲取當前的模型對象實例
readMaster($allTable = false)[void]    設置後續從主庫讀取數據
getBuilder()[Builder類]    獲取當前的builder實例對象

name($name)[Query]    指定默認的數據表名(不含前綴)
setTable($table)[Query]    指定默認數據表名(含前綴)
getTable($name = '')[string]    獲得當前或者指定名稱的數據表
parseSqlTable($sql)[string]     將SQL語句中的__TABLE_NAME__字符串替換成帶前綴的表名(小寫)

query($sql, $bind = [], $master = false, $class = false)[mixed]    執行查詢 返回數據集
xecute($sql, $bind = [])[int]    執行語句
getLastInsID($sequence = null)[string]    獲取最近插入的ID
getLastSql()[string][string]    獲取最近一次查詢的sql語句
transaction($callback)[mixed]    執行數據庫事務
startTrans()[void]    啓動事務
commit()[void]    用於非自動提交狀態下面的查詢提交
rollback()[void]    事務回滾
batchQuery($sql = [], $bind = [])[boolean]    批處理執行SQL語句  批處理的指令都認爲是execute操做
getConfig($name = '')[boolean]    獲取數據庫的配置參數

getPartitionTableName($data, $field, $rule = [])[string]    獲得分表的的數據表名
value($field, $default = null, $force = false)[mixed]    獲得某個字段的值
column($field, $key = '索引')[array]    獲得某個列的數組
count($field = '*')[integer|string]    COUNT查詢
aggregate($aggregate, $field, $force = false)[mixed]    聚合查詢
sum($field)[float|int]    SUM查詢
min($field, $force = true)[mixed]    MIN查詢
max($field, $force = true)[mixed]    MAX查詢
avg($field)[float|int]    AVG查詢
setField($field, $value = '')[integer]  設置記錄的某個字段值   支持使用數據庫字段和方法
setInc($field, $step = 1, $lazyTime = 0)[integer|true]    字段值(延遲)增加
setDec($field, $step = 1, $lazyTime = 0)[integer|true]    字段值(延遲)減小

join($join, $condition = null, $type = 'INNER')[Query]    查詢SQL組裝 join  
union($union, $all = false)[Query]    查詢SQL組裝 union
field($field, $except = false, $tableName = '', $prefix = '', $alias = '')[Query] 指定查詢字段 支持字段排除和指定數據表
fieldRaw($field, array $bind = [])[Query]    表達式方式指定查詢字段
data($field, $value = null)[Query]    設置數據
inc($field, $step = 1)[Querey]    字段值增加
dec($field, $step = 1)[Querey]    字段值減小
exp($field, $value)[Query]    使用表達式設置數據
raw($value)[Expression]    使用表達式設置數據
view($join, $field = true, $on = null, $type = 'INNER')[Query]    指定JOIN查詢字段
\think\Db::table('sky_user a')->view('sky_user b','username,password',"a.uid=b.uid",'INNER')->select();
等同於
\think\Db::table(['sky_user'=>"a"])->view(['sky_user'=>"b"],['username'=>"u","password"],"a.uid=b.uid",'INNER')->select();
partition($data, $field, $rule = [])[Query] 設置分表規則 where($field, $op = null, $condition = null)[Query] 指定AND查詢條件 whereOr($field, $op = null, $condition = null)[Query] 指定OR查詢條件 whereXor($field, $op = null, $condition = null)[Query] 指定XOR查詢條件 whereRaw($where, $bind = [], $logic = 'AND')[Query] 指定表達式查詢條件 whereOrRaw($where, $bind = [])[Query] 指定表達式查詢條件 OR whereNull($field, $logic = 'AND')[Query] 指定Null查詢條件 whereNotNull($field, $logic = 'AND')[Query] 指定NotNull查詢條件 whereIn($field, $condition, $logic = 'AND')[Query] 指定In查詢條件 whereNotIn($field, $condition, $logic = 'AND')[Query] 指定NotIn查詢條件 whereLike($field, $condition, $logic = 'AND')[Query] 指定Like查詢條件 whereNotLike($field, $condition, $logic = 'AND')[Query] 指定NotLike查詢條件 whereBetween($field, $condition, $logic = 'AND')[Query] 指定Between查詢條件 whereNotBetween($field, $condition, $logic = 'AND')[Query] 指定NotBetween查詢條件 whereExp($field, $condition, $logic = 'AND')[Query] 指定Exp查詢條件 useSoftDelete($field, $condition = null)[Query] 設置軟刪除字段及條件 removeWhereField($field, $logic = 'AND')[Query] 去除某個查詢條件 removeOption($option = true)[Query] 去除查詢參數 limit($offset, $length = null)[Query] 指定查詢數量 page($page, $listRows = null)[Query] 指定分頁 $config =[ 'page'=>1,//當前頁 'path'=>1,//url路徑 'query'=>1,//url額外參數 'fragment'=>1,//url錨點 'var_page'=>1,//分頁變量 'list_rows'=>1,//每頁數量 'type'=>1,//分頁類名 ]; paginate($listRows = null, $simple = false, $config = [])[\think\Paginator] 分頁查詢 table($table)[Query] 指定當前操做的數據表 using($using)[Query] SING支持 用於多表刪除 order($field, $order = null)[Query] 指定排序 order('id','desc') 或者 order(['id'=>'desc','create_time'=>'desc']) orderRaw($field, array $bind = [])[Query] 表達式方式指定Field排序 cache($key = true, $expire = null, $tag = null)[Query] 查詢緩存 group($group)[Query] 指定group查詢 having($having)[Query] 指定having查詢 lock($lock = false)[Query] 指定查詢lock(是否lock) distinct($distinct)[Query] 指定distinct查詢(是否惟一) alias($alias)[Query] 指定數據表別名 orce($force)[Query] 指定強制索引 fetchSql($fetch = true)[Query] 獲取執行的SQL語句 fetchPdo($pdo = true)[Query] 不主動獲取數據集 master()[Query] 設置從主服務器讀取數據 strict($strict = true)[Query] 設置是否嚴格檢查字段名 failException($fail = true)[Query] 設置查詢數據不存在是否拋出異常 sequence($sequence = null)[Query] 設置自增序列名 pk($pk)[Query] 指定數據表主鍵 whereTime($field, $op, $range = null)[Query] 查詢日期或者時間 getTableInfo($tableName = '', $fetch = '')[mixed] 獲取數據表信息 getPk($options = '')[string|array] 獲取當前數據表的主鍵 getTableFields($table = '')[??] 獲取當前數據表字段信息 getFieldsType($table = '')[??] 獲取當前數據表字段類型 getFieldsBind($table = '')[??] 獲取當前數據表綁定信息 bind($key, $value = false, $type = PDO::PARAM_STR)[Query] 參數綁定 isBind($key)[boolean] 檢測參數是否已經綁定 options(array $options)[Query] 查詢參數賦值 getOptions($name = '')[mixed] 獲取當前的查詢參數 with($with)[Query] 設置關聯查詢JOIN預查詢 withCount($relation, $subQuery = true)[Query] 關聯統計 withField($field)[Query] 關聯預加載中 獲取關聯指定字段值 via($via = '')[Query] 設置當前字段添加的表別名 relation($relation)[Query] 設置關聯查詢 insert(array $data = [], $replace = false, $getLastInsID = false, $sequence = null)[integer|string] 插入記錄 insertGetId(array $data, $replace = false, $sequence = null)[integer|string] 插入記錄並獲取自增ID insertAll(array $dataSet, $replace = false, $limit = null)[integer|string] 批量插入記錄 selectInsert($fields, $table)[integer|string] 經過Select方式插入記錄 update(array $data = [])[integer|string] 更新記錄 getPdo()[\PDOStatement|string] 執行查詢但只返回PDOStatement對象 select($data = null)[Collection|false|\PDOStatement|string] 查找記錄 find($data = null)[array|false|\PDOStatement|string|Model] 查找單條記錄 selectOrFail($data = null)[array|\PDOStatement|string|Model] 查找多條記錄 若是不存在則拋出異常 findOrFail($data = null)[array|\PDOStatement|string|Model] 查找單條記錄 若是不存在則拋出異常 chunk($count, $callback, $column = null, $order = 'asc')[boolean] 分批數據返回處理 getBind()[array] 獲取綁定的參數 並清空 buildSql($sub = true)[string] 建立子查詢SQL delete($data = null)[int] 刪除記錄 static event($event, $callback)[void] 註冊回調方法
相關文章
相關標籤/搜索