1. 程式人生 > >thinkphp5.0學習(七):資料庫操作

thinkphp5.0學習(七):資料庫操作

一、支援資料庫的型別

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();
    }