thinkphp5.0學習(七):資料庫操作
阿新 • • 發佈:2019-02-09
一、支援資料庫的型別
Mysql,SqlServer,pgSQL,Sqlite等資料庫的支援
二、如何連線資料庫
1.配置檔案定義
a.配置檔案目錄
專案\application\database.php
b.如何配置
return [
// 資料庫型別
'type' => 'mysql',
// 伺服器地址
'hostname' => '127.0.0.1',
// 資料庫名
'database' => '',
// 使用者名稱
'username' => 'root' ,
// 密碼
'password' => '',
// 埠
'hostport' => '3306',
];
c.如何使用
// 例項化系統資料庫類
$DB=new Db;
// 查詢資料
$data=$DB::table("user")->select();
//使用sql語句
$data=$DB::query("select * from user");
2.方法配置
1.使用陣列
//Db類中的connect方法:資料庫初始化 並取得資料庫類例項
$DB=Db::connect([
// 資料庫型別
'type' => 'mysql',
// 伺服器地址
'hostname' => '127.0.0.1',
// 資料庫名
'database' => 'edu',
// 使用者名稱
'username' => 'root',
// 密碼
'password' => '',
// 埠
'hostport' => '3306',
]);
2.使用字串
//Db類中的connect方法:資料庫初始化 並取得資料庫類例項
$DB =Db::connect("mysql://root:@127.0.0.1:3306/edu#utf8");
3.如何使用
$data=$DB->table('user')->select();
3.模型類定義
1.建立資料模型
- a.命令列建立
b.手動建立
1.開啟資料模型目錄(專案\application\index\model)
2.在目錄檔案下新建檔案User.php
3.在檔案中書寫程式碼<?php // 宣告名稱空間(位置) namespace app\index\model; // 宣告控制器 use think\Model; class User extends Model { } ?>
2.如何設定
<?php
// 宣告名稱空間(位置)
namespace app\index\model;
// 宣告控制器
use think\Model;
class User extends Model
{
// 使用陣列連線資料庫
protected $connection=[
// 資料庫型別
'type' => 'mysql',
// 伺服器地址
'hostname' => '127.0.0.1',
// 資料庫名
'database' => 'edu',
// 使用者名稱
'username' => 'root',
// 密碼
'password' => '',
// 埠
'hostport' => '3306',
];
//使用字串
protected $connection="mysql://root:@127.0.0.1:3306/edu#utf8";
}
?>
3.如何控制器中使用
// 使用模型定義連線
public function data2(){
echo "使用模型連線資料庫";
$user=new \app\index\model\User();
dump($user::all());
}
三、查詢資料
1.tp方法
// 例項化系統資料庫類
$DB=new Db;
// 查詢資料
$data=$DB::table("user")->select();
2.使用sql語句
//使用sql語句
$data=$DB::query("select * from user");
四、資料庫的基本使用
支援query(查詢操作)和execute(寫入操作)
0.獲取指定sql語句
// 獲取執行的sql語句
echo Db::getLastSql();
1.查詢
$data=Db::query("select * from user");
$data=Db::query("select * from user where id >=? and id<=?",[5,8]);
2.增加
$data=Db::execute("insert into user value(null,'user1','123','18')");
$data=Db::execute("insert into user value(null,?,?,?)",['user2','123','20']");
$data=Db::execute("insert into user value(null,:name,:pass,:age)",['name'=>'user3','pass'=>'123','age'=>'20']);
3.刪除
$data=Db::execute("delete from user where id=10");
$data=Db::execute("delete from user where id>?",[15]);
$data=Db::execute("delete from user where id>:id",['id'=>10]);
4.修改
$data=Db::execute("update user set age='20' where id=?",[15]);
五、TP資料處理
1.查詢操作
1.table方法查詢資料
// 查詢所有資料
$data=Db::table("user")->select();
// 查詢一條資料
$data=Db::table("user")->find();
2.name方法查詢資料
//name方法會自動新增上配置檔案中的表字首,與配置檔案有關
$data=Db::name("user")->select();
$data=Db::name("user")->find();
3.助手函式
$data=db("user")->select();
$data=db("user")->find();
4.where條件匹配
$data=Db::table("user")->where("id",">",5)->select();
$data=Db::table("user")->where("id","<",11)->where("id",">",8)->select();
$data=Db::table("user")->where("name","like","%tian%")->select();
$data=Db::table("user")->where("name","wanlisha")->where("pass","wanlisha")->select();
5.whereor條件查詢
$data=Db::table("user")->where("id","<=",'21')->whereOr("id","<=",5)->select();
$data=Db::table("user")->where("name",'like',"%tian%")->whereOr("name",'like','%wanli%')->select();
$data=Db::table("user")->where("name|pass",'like',"%tian%")->select();//
6.limit擷取資料
$data=Db::table("user")->limit(2)->select();
$data=Db::table("user")->limit(0,2)->select();
7.order實現排序
$data=Db::table("user")->order('id')->select();
$data=Db::table("user")->order("id","desc")->select();
8.field 設定查詢欄位
//設定查詢欄位
$data=Db::table("user")->field('name,pass')->select();
$data=Db::table("user")->field(['name','pass'])->select();
// 給name起別名
$data=Db::table("user")->field('name uname,pass')->select();
$data=Db::table("user")->field(['name'=> 'uname','pass'])->select();
// sql的系統函式
$data=Db::table("user")->field("count(*) as tot")->select();
$data=Db::table("user")->field(["count(*)"=>"tot"])->select();
//排除欄位
$data=Db::table("user")->field("name,pass",true)->select();
$data=Db::table("user")->field(["name","pass"],true)->select();
9.Page實現分頁效果
$data=Db::table("user")->page(3,5)->select();
$data=Db::table("user")->page("3,5")->select();
10.分組聚合
$data=Db::table("user")->field("pass,count(*) tot")->group("pass")->select();
11.having過濾
// 只能結合分組使用
$data=Db::table("user")->field("pass,count(*) tot")->having("tot >=4")->group("pass")->select();
12.多表查詢
// 內斂實現資料庫連線
$data=Db::query("select product.*,fenlei.name tname from fenlei,product where product.cid=fenlei.id");
$data=Db::table("product")->field("product.*,fenlei.name tname")->join("fenlei","product.cid=fenlei.id")->select();
// 右連結
$data=Db::table("product")->field("product.*,fenlei.name tname")->join("fenlei","product.cid=fenlei.id",'right')->select();
// 左連結
$data=Db::table("product")->field("product.*,fenlei.name tname")->join("fenlei","product.cid=fenlei.id",'left')->select();
13.別名使用-給表起別名
$data=Db::table("product")->alias('p')->field("p.*,f.name fname")->join("fenlei f","p.cid=f.id",'left')->select();
14.union集合
$data=Db::field("name")->table("user")->union("select name from product")->select();
15.引數繫結bind為了防止sql注入
//自動輕微防止sql注入
$data=Db::table("user")->where("id",$id)->delete();
//不防注入 建議不要使用原生的sql語句
$data=Db::execute("delete from user where id=$id");
//防注入
$data=Db::table("user")->where("id",":id")->bind(['id'=>[$id,\PDO::PARAM_INT]])->delete();
16.統計資料
$data=Db::table("user")->max("age");
$data=Db::table("user")->min("age");
$data=Db::table("user")->avg("age");
$data=Db::table("user")->sum("age");
$data=Db::table("user")->count();
17.檢視查詢(多表查詢)
$data=Db::view("goods","id,name,price")->view("type","name","type.id=goods.cid")->select();
// 左連線
$data=Db::view("goods","id,name,price")->view("type","name","type.id=goods.cid","right")->select();
// 右連線
$data=Db::view("goods","id,name,price")->view("type","name","type.id=goods.cid","left")->select();
2.插入操作
1.插入單條資料
// 陣列中的欄位名必須和資料庫中欄位名一致
$data=[
'name'=>'張三',
'pass'=>'123',
'age'=>18
];
// 返回值:影響行數
$code=Db::table("user")->insert($data);
$code=db("user")->insert($data);
2.插入多條資料
$data=[
[
'name'=>'張三1',
'pass'=>'123',
'age'=>18
],
[
'name'=>'張三2',
'pass'=>'123',
'age'=>18
]
];
//返回值:影響行數
$code=Db::table("user")->insertAll($data);
$code=db("user")->insertAll($data);
3.獲取最後一次插入的id
$data=[
'name'=>'張三1',
'pass'=>'123',
'age'=>18
];
$code=Db::table("user")->insertGetId($data);
$code=db("user")->insertGetId($data);
3.更新資料
1.修改資料
$code=Db::table("user")->where("id",">",5)->update(["age"=>111,"pass"=>'111']);
$code=Db::table("user")->update(["id"=>5,"age"=>60]);
code=Db::table("user")->where("id",5)->setField("age",111);
2.設定自增
$code=Db::table("user")->where("id",6)->setInc("age");
3.設定自減
$code=Db::table("user")->where("id",7)->setDec("age");
$code=Db::table("user")->where("id",5)->setDec("age",3);
4.刪除資料
1.刪除一條資料
$code=Db::table("user")->where("id",6)->delete();
$code=Db::table("user")->delete(7);
2.刪除多條資料
$code=Db::table("user")->where("id in(1,2)")->delete();
$code=Db::table("user")->delete([2,3]);
3.刪除區間資料
$code=Db::table("user")->where("id>0 and id<5")->delete();
六、事務機制
1.mysql事務
要求資料的引擎必須是InnoDB
重點:對要操作的資料表執行語句:ALTER TABLE user ENGINE=INNODB;
2.使用
1. 自動控制事務
Db::transaction(function(){
// 刪除一條資料
Db::table("user")->delete(11);
Db::table("user")->deletes(40);
});
2. 手動控制事務
// 手動控制事務
// 開啟事務
Db::startTrans();
try{
// 刪除資料
$a=Db::table("user")->delete(11);
// 判斷是否刪除成功
if(!$a){
throw new \Exception("刪除11沒有成功");
}
// 刪除不存在的資料
$b=Db::table("user")->delete(12);
if(!$b){
throw new \Exception("刪除12沒有成功");
}
// 執行提交操作
Db::commit();`這裡寫程式碼片`
echo "成功";
}catch(\Exception $e){
// 回滾事務
echo "失敗";
Db::rollback();
dump($e->getmessage());
}
// 開啟事務
Db::startTrans();
// 刪除資料
$a=Db::table("user")->delete(1);
$b=Db::table("user")->delete(2);
// 判斷條件
if($a && $b){
// 提交事務
Db::commit();
}else{
Db::rollback();
}