一、thinkphp5的數據庫操做php
鏈接數據庫庫的方式mysql
a、配置文件定義:配置文件位於application\database.php, 訪問:$db::table('user')->select();sql
b、方法配置thinkphp
Db::connect([ // 數據庫類型 'type' => 'mysql', // 數據庫鏈接DSN配置 'dsn' => '', // 服務器地址 'hostname' => '127.0.0.1', // 數據庫名 'database' => 'thinkphp', // 數據庫用戶名 'username' => 'root', // 數據庫密碼 'password' => '', // 數據庫鏈接端口 'hostport' => '', // 數據庫鏈接參數 'params' => [], // 數據庫編碼默認採用utf8 'charset' => 'utf8', // 數據庫表前綴 'prefix' => 'think_', ]);
//訪問
$data = $db->table('user')->select();
也可使用字符串鏈接數據庫
Db::connect('mysql://root:1234@127.0.0.1:3306/thinkphp#utf8');
c、模型類定義數組
<?php namespace app\index\model; use think\Model; class User extends Model{ protected $connection = [ // 數據庫類型 'type' => 'mysql', // 服務器地址 'hostname' => '127.0.0.1', // 數據庫名 'database' => 'learn', // 用戶名 'username' => 'root', // 密碼 'password' => '******', // 端口 'hostport' => '3306', ]; }
//在控制器中進行使用
public function index(){ $user = new User(); $data = $user::all(); dump($data); }
使用數據庫操做服務器
普通查詢和操做,可使用Db這個對象,也可以使用內置的方法db()->query(...) 方法app
//返回的是查詢的數據 $data = Db::query('select * from `user`'); $data = Db::query('select `name`, `phone` from `user` where `id` > :id', ['id' => 5]); //返回的是執行成功的記錄數 $res = Db::execute('INSERT INTO `user` (`name`, `age`, `sex`, `phone`) VALUES ("yyy", 20, 0, 15756453562)'); $res = Db::execute('INSERT INTO `user` (`name`, `age`, `sex`, `phone`) VALUES (:name, :age, :sex, :phone)', ['name'=> 'fff', 'age'=> 30, 'sex'=> 1, 'phone'=> 15463547565]);
使用構造器進行查詢操做函數
//table name 的使用 //一般沒有設置前綴的時候能夠用table $res = Db::table('user')->select(); //有設置前綴用name,可是沒有設置前綴的狀況下,也可用使用 $res = Db::name('user')->select();
$res = Db::table('user')->field(true)->where('id', 60)->value('name');
where的使用thinkphp5
//where的使用 $result = Db::table('user')->where(function ($query) { $query->where('id', 1)->whereor('id', 2); })->whereOr(function ($query) { $query->where('name', 'like', 'think')->whereOr('name', 'like', 'thinkphp'); })->select(); //多個where鏈式調用 $res = Db::table('user')->where('id', '>', 5)->where('name', 'abc')->select(); //也能夠進行如下查詢 $res = Db::table('user')->where(['id' => ['>', 5], 'age' => ['<', 28]])->select(); $res = Db::table('user')->where(['id'=> 1, 'name'=> 'abc'])->select(); $res = Db::table('user')->where('id=2 and name="小紅"')->select(); $res = Db::table('user')->where('id=:id and name=:name')->bind(['id'=> 2, 'name'=> '小紅'])->select(); Db::table('user') ->where('name','like','%thinkphp') ->where('status',1) ->find(); //能夠寫成如下的方法 Db::table('user') ->where('name&title','like','%thinkphp') ->find(); Db::table('user') ->where('name','like','%thinkphp') ->whereOr('title','like','%thinkphp') ->find(); //能夠寫成如下方法 Db::table('user') ->where('name|title','like','%thinkphp') ->find();
$res = User::whereBetween('id', [10, 50])->select(); $res = User::whereIn('id', [10, 50])->select();
TP運算符 | SQL運算符 | 例子 | 實際查詢條件 |
---|---|---|---|
eq | = | $map['id'] = array('eq',100); | 等效於:$map['id'] = 100; |
neq | != | $map['id'] = array('neq',100); | id != 100 |
gt | > | $map['id'] = array('gt',100); | id > 100 |
egt | >= | $map['id'] = array('egt',100); | id >= 100 |
lt | < | $map['id'] = array('lt',100); | id < 100 |
elt | <= | $map['id'] = array('elt',100); | id <= 100 |
like | like | $map<'username'> = array('like','Admin%'); | username like 'Admin%' |
between | between and | $map['id'] = array('between','1,8'); | id BETWEEN 1 AND 8 |
not between | not between and | $map['id'] = array('not between','1,8'); | id NOT BETWEEN 1 AND 8 |
in | in | $map['id'] = array('in','1,5,8'); | id in(1,5,8) |
not in | not in | $map['id'] = array('not in','1,5,8'); | id not in(1,5,8) |
and(默認) | and | $map['id'] = array(array('gt',1),array('lt',10)); | (id > 1) AND (id < 10) |
or | or | $map['id'] = array(array('gt',3),array('lt',10), 'or'); | (id > 3) OR (id < 10) |
xor(異或) | xor | 兩個輸入中只有一個是true時,結果爲true,不然爲false,例子略。 | 1 xor 1 = 0 |
exp | 綜合表達式 | $map['id'] = array('exp','in(1,3,8)'); | $map['id'] = array('in','1,3,8'); |
alias的使用
Db::table('think_user')->alias('a')->join('__DEPT__ b ','b.user_id= a.id')->select(); Db::table('think_user')->alias(['think_user'=>'user','think_dept'=>'dept'])->join('think_dept','dept.user_id= user.id')->select();
field的使用
//默認選擇所有字段 $res = Db::table('user')->field(true)->select(); //至關於select * from user,不過建議使用上面的語法 $res = Db::table('user')->field('*')->select(); //選擇除了id以外的全部字段 $res = Db::table('user')->field('id',true)->select(); //注意:這裏只有一個參數 $res = Db::table('user')->field('name AS n, age AS a')->select(); $res = Db::table('user')->field(['name'=> 'n', 'age'=> 'a'])->select(); $res = Db::table('user')->field(['id', 'SUM(`age`)' => 's'])->select();
order的使用
//當若是有指定desc或者asc的時候按指定的排序,若是沒有指定時默認按asc進行排序 $res = Db::table('user')->field(true)->order('age desc, sex')->select(); $res = Db::table('user')->field(true)->order(['age'=>'asc', 'sex'])->select(); //當你的order排序中使用了SQL函數的時候,請使用orderRaw方法替代order $res = Db::table('user')->field(true)->orderRaw('rand()')->select();
limit與page的使用
//表示只選取10條記錄 $res = Db::table('user')->field(true)->order('age desc')->limit(10)->select(); //表示偏移3條記錄後再選取4條記錄 $res = Db::table('user')->field(true)->order('age desc')->limit(3,4)->select(); //使用page方法進行分頁 如下表示在第三頁的三條,那麼至關於偏移了6條記錄 $res = Db::table('user')->field(true)->order('age desc')->page(3, 3)->select(); //也可使用混合,如下表示在第二頁的四條數據,那麼至關於偏移了4條記錄 $res = Db::table('user')->field(true)->order('age desc')->limit(4)->page(2)->select();
group與having的使用
//group能夠進行分組,支持多個字段分組 $res = Db::table('user')->field(true)->group('sex,name')->having('sex=1 and age>30')->select(); //having與where的區別在於前者能夠從刷選後在名稱裏去讀取,而where只能從原有的字段中讀取 $res = Db::table('user')->field(['name'=>'n', 'age'=>'a', 'sex'=>'s'])->having('s=0')->select();
子查詢與join以及distinct的使用
//獲取子查詢的sql語句 $sub = Db::table('user')->field(['SUM(`age`)'=> 's'])->buildSql(); $sub = Db::table('user')->field(['SUM(`age`)'=> 's'])->fetchSql(true)->select(); //推薦使用如下的子查詢創建方法 $sub = Db::table('user')->field(['SUM(`age`)'=> 's', 'id'])->buildSql(); //利用join進行表與表的關聯操做,type裏的值能夠是left, right, inner, full $res = Db::table('user')->alias('u')->join([$sub => 'm'], 'm.id = u.id', 'right')->select(); //查詢惟一的字段若是有兩個數據的是相同的,那麼就展現一個 $res = Db::table('user')->distinct(true)->field('name' )->select();
聚合函數的使用
方法 | 說明 |
---|---|
count | 統計數量,參數是要統計的字段名(可選) |
max | 獲取最大值,參數是要統計的字段名(必須) |
min | 獲取最小值,參數是要統計的字段名(必須) |
avg | 獲取平均值,參數是要統計的字段名(必須) |
sum | 獲取總分,參數是要統計的字段名(必須) |
$res = Db::table('user')->count(); $res = Db::table('user')->sum('age'); $res = Db::table('user')->avg('age'); $res = Db::table('user')->max('age'); $res = Db::table('user')->min('age');
事務性操做
Db::transaction(function(){ Db::table('think_user')->find(1); Db::table('think_user')->delete(1); }); // 啓動事務 Db::startTrans(); try{ Db::table('think_user')->find(1); Db::table('think_user')->delete(1); // 提交事務 Db::commit(); } catch (\Exception $e) { // 回滾事務 Db::rollback(); }
添加數據的操做
$data = [ 'name' => '林華華', 'sex' => 1, 'age' => 28, 'phone' => 15746563538 ]; $list = [ [ 'name' => '項少龍', 'sex' => 0, 'age' => 28, 'phone' => 15746563539 ], [ 'name' => '何潤東', 'sex' => 0, 'age' => 28, 'phone' => 15746563543 ] ]; try{ //添加一條記錄 $res = Db::table('user')->insert($data); //若是成功,那麼就返回成功的記錄數 $res = Db::table('user')->insertGetId($data); //若是成功,那麼就返回新增的id $res = Db::table('user')->insertAll($list); //是一個數據的二維數組,返回的是成功的條數 dump(Db::table('user')->getLastInsID()); //獲取最後條數據的id dump($res); }catch(\Exception $e) { dump($e->getCode()); } $sql = Db::getLastSql(); dump($sql);
更改數據操做
$res = Db::table('user')->where('id', 50)->update(['name'=> '陸毅']); $res = Db::table('user')->where('id', 60)->setField('name', '劉備'); $res = Db::table('user')->where('id', 60)->setField(['name' => '張飛', 'sex'=> 0]); $res = Db::table('user')->field(true)->select(); //須要用到函數的可使用如下方法 Db::table('think_user') ->where('id', 1) ->update([ 'login_time' => Db::raw('now()'), 'login_times' => Db::raw('login_times+1'), ]);
刪除數據操做
// 根據主鍵刪除 Db::table('think_user')->delete(1); Db::table('think_user')->delete([1,2,3]); //經常使用刪除方法 $res = Db::table('user')->where('name', '林華華')->delete();
注意:
Db::table('user'); //是能夠用db('user')來替代的 //獲取最後一條的執行數據 dump(Db::getLastSql());
二、使用model類進行數據庫操做
<?php namespace app\index\model; use think\Model; class User extends Model { //若是表名和類名一致,那麼能夠不定義table這個關鍵字,若是不同,那麼按以下進行定義 protected $table = 'user'; //若是主鍵id是id的狀況,那麼能夠不定義,若是不一致,那麼要進行以下配置 protected $pk = 'id'; //通用配置在database.php裏的 'resultset_type' => 'array', 可是多數據查詢後的結果要進行循環後才能使用,若是使用collection,那麼就能夠調用toArray()方法 //注意:這裏是不影響Db::table('user')->field(true)->select()的結果
protected $resultSetType = 'collection'; } ?>
model的初步調用
//靜態調用,查詢單條記錄,get裏面是主鍵id dump(User::get(50)->toArray()); //實例化類進行調用 dump((new User())::get(50)->toArray()); //調用內部的方法 dump(model('User')::get(50)->toArray()); //利用loader類進行自動加載 dump((Loader::model('User'))::get(50)->toArray());
model裏的查詢的方法
//查詢主鍵id爲3的數據 $res = User::get(3)->toArray();
$res = User::get(['id' => 1, 'name' => 'abc']) //查詢主鍵id在【1,2,3,4】裏面的數據 $res = User::all([1, 2, 3, 4])->toArray(); //動態查詢語句 $res = User::getByAge(48)->toArray(); $res = User::getByName('劉德華')->toArray(); $res = User::getById(1)->toArray(); //獲取指定字段的值 $res = User::where('id', 3)->value('name'); $res = User::where('id', 3)->column('name'); //能夠調用Db裏的方法進行查詢 $res = User::field(true)->order(['age'=>'desc'])->select()->toArray(); //前提是User表中的$resultSetType = 'collection';
model裏的新增方法
//方法一 $data = new User(); $data->data([ 'name' => 'bill', 'age' => 32, 'sex' => 0, 'phone' => 15474655463 ]); $res = $data->save(); //方法二 $data = new User(); $data->name = 'rick'; $data->age = 38; $data->sex = 0; $data->phone = 17483902938; $res = $data->save(); //方法三 $data = new User(); $res = $data->allowField(true)->save([ //若是須要指定字段,那麼須要傳入數組 'name' => 'jeere', 'age' => 20, 'sex' => 0, 'phone' => 10987463524 ]);
public static function getInfo() { $data = [ 'name' => '小雷', 'age' => 30, 'sex' => '男', 'phone' => 17465546374 ]; return self::create($data); }
添加多條數據
$user = new User; $list = [ ['id'=>1, 'name'=>'thinkphp', 'email'=>'thinkphp@qq.com'], ['id'=>2, 'name'=>'onethink', 'email'=>'onethink@qq.com'], ]; $user->saveAll($list, false);
使用靜態方法添加
$user = User::create([ 'name' => 'thinkphp', 'email' => 'thinkphp@qq.com' ]); echo $user->name; echo $user->email; echo $user->id; // 獲取自增ID
model裏的更新方法,除了可使用Db裏的方法還可使用如下方法
$user = new User; // save方法第二個參數爲更新條件 $user->save([ 'name' => 'thinkphp', 'email' => 'thinkphp@qq.com' ],['id' => 1]);
model裏的刪除方法,除了可使用Db裏的delete方法還可使用如下方法
$res = User::destroy(['name'=> 'are you ok???']); dump($res);
二、獲取器的使用
//在表中定義獲取器前面用get+字段名+Attr傳入參數$val public function getSexAttr($val) { $arr = [0 => '男', 1 => '女']; return $arr[$val]; } //那麼使用Model進行調用的時候會進行自動轉換 $res = User::get(60); dump($res->toArray()); //可是若是沒有調用model裏面的方法,而是調用Db裏的方法,那麼就不能進行自動轉換
若是須要調用model裏的原始數據
$user = User::get(1); // 經過獲取器獲取字段 echo $user->status; // 獲取原始字段數據 echo $user->getData('status'); // 獲取所有原始數據 dump($user->getData());
三、修改器的使用(修改器的觸發條件是save)
//在model類中定義方法,那麼在調用model類的更新儲存的時候就會進行修改 public function setSexAttr($val) { if($val == '男') { return 0; } return 1; }
調用,注意這裏只能用save而不能用update這個方法
$user = new User(); $res = $user->save(['name' => 'fengge', 'sex' => '男'], ['id' => 60]); dump($res); dump(Db::getLastSql());
利用model中的方法進行表的鏈接操做
public static function getInfo() { $sub = self::field(['SUM(age)'=>'total', 'id'])->buildSql(); $res = self::alias('u')->field(['u.id', 'name', 'age', 'sex', 's.total'])->join([$sub => 's'], 's.id = u.id', 'inner')->select(); return $res->toArray(); }
四、自動完成
數據自動完成指在不須要手動賦值的狀況下對字段的值進行處理後寫入數據庫。
系統支持auto
、insert
和update
三個屬性,能夠分別在寫入、新增和更新的時候進行字段的自動完成機制,auto屬性自動完成包含新增和更新操做,例如咱們定義User
模型類以下:
namespace app\index\model; use think\Model; class User extends Model { protected $auto = []; protected $insert = ['ip','status' => 1]; protected $update = ['login_ip']; protected function setIpAttr() { return request()->ip(); } }
五、簡要的語法
Db::table('data') ->where('id',1) ->inc('read') //自增 ->dec('score',3) //自減 ->exp('name','UPPER(name)') ->update();