ThinkPHP6.0 資料庫鍊式操作



ThinkPHP6 資料庫鍊式操作

  • #資料庫提供的鍊式操作方法,可以有效的提高資料訪問的程式碼清晰度和開發效率,並且支援所有的CURD操作

  • 帶*標識的表示支援多次呼叫

連貫運算 作用 支援的參數類型
where*用於AND查詢字串、陣列和物件
table 用於定義要操作的資料表名稱字串和陣列
#name 用於定義要操作的資料表名稱字串
field*用於定義要查詢的欄位(支援欄位排除)字串和陣列
order*用於對結果排序#字串和陣列
limit 用來限制查詢結果數字串和數字
page 用於查詢分頁(內部會轉換成limit )字串與數字
#

一、表達式查詢

  • 表達式是SQL語句的條件

  • 表達式不分大小寫

  • 表達式寫在where裡

##意思查詢方法=等於<>不等於>#大於>=大於等於#<<=[ NOT] LIKE[NOT] BETWEEN[NOT] IN#whereIn/whereNotIn[NOT] NULL查詢欄位是否(不)是NULL#whereNull/whereNotNull
#表達式




##小於
小於等於
模糊查詢whereLike/whereNotLike
#(不在)區間查詢 whereBetween/whereNotBetween
(不在)IN 查詢 whereIn/whereNotIn
#########

where查詢

  • where方法在鍊式操作方法裡面是最常用的方法,可以完成包含普通查詢、表達式查詢、快速查詢、區間查詢、組合查詢在內的條件查詢操作

# 等於(=)

$select = Db::table('shop_goods')- >where('id','=','1')->select();

print_r($select->toArray());


## 不等於(<>)

$select = Db::table('shop_goods')->where('id','<>',' 2')->select();

print_r($select->toArray());


# 大於(>)

$select = Db::table('shop_goods')->where('id','>','3')->select();

#print_r( $select->toArray());


# 大於等於(>=)

$select = Db::table('shop_goods' )->where('id','>=','4')->select();

print_r($select->toArray());


# 小於(<)

$select = Db::table('shop_goods')->where('id','<','5 ')->select();

print_r($select->toArray());


# 小於等於(<=)

$select = Db::table('shop_goods')->where('id','<=','6')->select();

# print_r($select->toArray());


## 多where

$select = Db::table('shop_goods')

            ->where('id','>','3')

            ->#here('id','<','8');',#8');

            ->select();

print_r($select->toArray());


# LIKE

$select = Db::table('shop_goods')->where('title','like','%洋裝%')->select();

print_r($select-> ;toArray());


#  NOT LIKE

$select = Db::table('shop_goods')->where('title' ,'not like','%洋裝%')->select();

print_r($select->toArray());


# BETWEEN

$select = Db::table('shop_goods')->where('id','between','6,10')->select();

print_r($select->toArray());


#  NOT BETWEEN

$select = Db::table('shop_goods ')->where('id','not between',[6,10])->select();

print_r($select->toArray());


# IN

$select = Db::table('shop_goods')->where('id','in','4,7, 10')->select();

print_r($select->toArray());


#  NOT IN

$select = Db::table('shop_goods')->where('id','not in',[4,7,10])->select();

# print_r($select->toArray());

二、資料表

1、table 和name

# 必須完整資料庫名

$select = Db::table('shop_goods')->where('id','10')->select();

print_r($select-> ;toArray());

# 資料庫未設定前綴

$select = Db::name('shop_goods')->where('id','11')-> ;select();

print_r($select->toArray());

# 資料庫設定前綴,無前綴存取

$select = Db::name ('list')->where('id','12')->select();

print_r($select->toArray());

#2、資料庫前綴

資料庫設定database.php

return [

    'connections'     => [

        'mysql' => [

            // 資料庫表格字首

            'prefix'  =##            'prefix'  =##            'prefix'

##        ]

    ]

];

三、回傳值

1、

field 

  • #field 方法主要作用是標識要傳回或操作的字段,可以用來查詢和寫入操作

  • 所有的查詢方法都可以使用field方法

# 字串

$select = Db::table('shop_goods')

            ->field( 'title,price,discount as d')

            ->where('status',1)

    print    #    ->select(##    print    #    ->select()##  print    #    ->)lect();##select_print ->toArray());

# 陣列

$select = Db::table('shop_goods')

            - >field([

                'title',

                'price',

##           ])

            ->where('status',1)

            ->select();

print_r($select--  ->select();

print_r($select--gt;

添加,只能加入這幾個欄位

# 多field

$data = [

    'title' = > '新商品',

    'price' => 50,

    'discount' => 8,

    'add_time' => 1576080000

##];

$insert = Db::table('shop_goods')

            ->field('title')

            ->field('price')

## gt ;field('add_time')

            ->insert($data);

print_r($insert);


print_r($insert);

  • ##n>
#查詢全部字段,速度較快

$select = Db::table('shop_goods')

            ->field(true)
  •  ;          // ->

    # ;   ('*')

  •             ->where('status',1)

            ->select();##print_r($selectprint_r($select();#pto; ));

2、

withoutField

  • #withoutField 方法作用排除資料表中的欄位

  • #
    Db::table('shop_goods')->withoutField('id')->select();
  • 3、

    fieldRaw

  • fieldRaw 方法直接使用mysql函數
Db::table('shop_goods')->fieldRaw('id,sum(price)')->select();

#四、排序

1、

order

方法用於對操作的結果排序或優先限制

預設正序

asc 正序

desc 倒序

$select = Db::table ('shop_goods')

            ->field('title,price,id')

            ->where('status',1)#> # ; order('price','DESC')

            ->order('id','DESC')

            ->)lect();#            -> $select->toArray());

    2、
  • orderRaw

    方法中使用mysql函數

    $select = Db::table( 'shop_goods')
            ->field('title,price,id')

            ->. ("field(title,'price','discount','stock')")

            ->select();

print_r($select->toArray());toArray()); ;

五、分頁###############limit ###方法主要用於指定查詢和操作的數量######### #######$select = Db::table('shop_goods')######            ->field('title,price,id')######           e -' status',1)######            ->order('price','DESC')###

            ->limit(3)

            ->select();

print_r($select->#Array());

#print_r($select->#Array());

$select = Db::table('shop_goods')

            ->field('title,price,id')

           ,id')

            -> ',1)

            ->order('price','DESC')

            ->limit(0,5)

lecto  )  ;

print_r($select->toArray());
  • #page

    方法主要用於分頁查詢

$select = Db::table('shop_goods')

            ->field('title,price,id')

        >where('status',1)

            ->order('price','DESC')

            ->page(1,5)##page(1,5)## ->select();

print_r($select->toArray());

六、聚合查詢

##聚合方法如果沒有數據,預設都是0,聚合查詢都可以配合其它查詢條件#功能count 統計數量,參數是要統計的欄位名稱(可選)max 取得最大值,參數是要統計的欄位名稱(必須)min 
###取得最小值,參數是要統計的欄位名稱(必須)### #########avg ######取得平均值,參數是要統計的欄位名稱(必須)############sum######取得總數,參數是要統計的欄位名稱(必須)#############

// 統計數量,參數是要統計的欄位名稱(可選)

$select = Db::table('shop_goods')->count();

print_r($select);


// 取得最大值,參數是要統計的欄位名稱(必須)

$select = Db ::table('shop_goods')->max('id');

print_r($select);


##// 取得最小值,參數是要統計的欄位名稱(必須)

$select = Db::table('shop_goods')->min('id');

print_r($select) ;


// 取得平均值,參數是要統計的欄位名稱(必須)

$select = Db::table('shop_goods') ->avg('id');

print_r($select);


#// 取得總數,參數是要統計的欄位名稱(必須)

$select = Db::table('shop_goods')->sum('id');

print_r($select);

#七、搜尋、排序範例

controller代碼

public function index(){

    $title = '商城';

    $ login = '歐陽克';

    # 左側選單

    $menu = Db::table('shop_menu')->where('fid',0)->select ();

    $left = $menu->toArray();

    foreach($left as &$left_v){

        $left_v['lists'] = Db::table('shop_menu')->where('fid',$left_v['id'])->select();

    }

    # 右側列表

    $param = Request::param();

    if(isset($param['status']) && $param['status'] == 1){

        $where['status'] = 1;

    }else if(isset($param['status']) && $param['status'] == 2){

        $where['status'] = 2;

    }else{

        $where = true;

 

o

o##o#o#o#o#o#o#list ::table('shop_goods')

                ->where($where)

           ->order(' id DESC')

                ->select();

    $right = $list->toArray();

#    $right = $list->toArray();

#    $right = $list->toArray();

#  問題 foreach($right as$. {

        $right_v['cat'] = Db::table('shop_cat')->where('id',$right_v['cat'])->value('name') ;

    }

    View::assign([

        'title'  => $title,

      1 'login' => $login, ###

        '左' => $left,

        '右' => $right,

        '狀態' => isset($param['status']) ? $param['status'] : null

    ]);

    return View::fetch();

}

#view程式碼

   

       

            <選擇名稱=「狀態」>

   status==0}已選擇{/if}>全部

               

               

    #       

    #        # ” /div>

       

八、分頁範例

controller程式碼

##public function index(){

    $title = '商城';

    $login = '歐陽克';

    # 左側選單

#    $menu = Db::table(' shop_menu')->where('fid',0)->select();

    $left = $menu->toArray();

    foreach($left as &$left_v){

        $left_v['lists'] = Db::table('shop_menu')->where('fid',$left_v['id'])->select( );

    }

    # 右側清單

    $param = Request::param();

#    if(isset($param['status ']) && $param['status'] == 1){

        $where['status'] = 1;

    }else if(isset($param['status' ]) && $param['status'] == 2){

        $where['status'] = 2;

    }else{

        $where    $where = true ;

    }

    $p = isset($param['p']) ? $param['p'] : 1;

#    // 統計總數

    $count = Db::table('shop_goods')->where($where)->count();

    $list = Db::table('shop_goods')

                ->where($where)

                - 我)

                ->page($p,10)

                ->select());

##    12 = $p $right as &$right_v){

        $right_v['cat'] = Db::table('shop_cat')->where('id',$right_v['cat'])-> ;value('name');

    }

    View::assign([

##      'title'  => $title,## ' => $login,

        'left' => $left,

        'right' => $right,

        'right' => $right,

#;#        'count' => ce ($count/10),

        'p' => $p,

        'status' => isset($param['status']) ? $param['status' => isset($param['status']) ? param['status' => '] : 0

    ]);

    return View::fetch();

}

view程式碼

<div class="layui-box layui-laypage layui-laypage-default">

    <a href="/index.php/Index/index?p={$p-1}&status={$status}" class="layui-laypage-prev {if $p<=1}layui -disabled{/if}">上一頁</a>

    {for start="0" end="$count"}

        {if $p == $ i 1}

            <span class="layui-laypage-curr">

                &#;em class="layui-laypageem/>

#                <em>{$i 1}</em>

            < }# # 

 # >  <a href= "/index.php/Index/index?p={$i 1}&status={$status}">{$i 1}</a>

        {/if}

    {/for}

    <a href="/index.php/Index/index?p={$p 1}&status={$status}" class="layui-laypage-next { if $p>=$count}layui-disabled{/if}">下一頁</a>

</div>

#4、模版分頁

paginate
    內建了分頁實現,要為資料添加分頁輸出功能變得非常簡單
  • ## render

    取得翻頁html程式碼
  • total

    取得總數量
  • controller程式碼

  • $select = Db::table('shop_goods')->paginate(10);

print_r($select);echo '<hr>';

# foreach($select as $v){

    print_r($v);echo '<hr>';

}

#print_r($select->render ());echo '<hr>';

print_r('總數:'.$select->total());echo '<hr>';

View ::assign([

    'select' => $select

]);

return View::fetch();

#view程式碼

<div>{$select|raw}</div>

#css程式碼

#.pagination {

    顯示:內嵌區塊;

    左填:0;

    邊距:20px 0;

    邊框半徑:4px;

}

.pagination > li {

    display: inline;

}

#.pagination >力> a,

.分頁>力>跨度{

位置:相對;

浮動:左;

內邊距:6 像素12 像素;

左邊距:-1 像素;

    行高:1.42857143;

    顏色:#337ab7;

    文字裝飾:無;

    背景顏色:#fff;

# #邊框:1px 實線 #ddd;

}

.pagination > li:第一個孩子> a,

.分頁> li:第一個孩子>跨度{

    左邊緣:0;

    左上方邊框半徑:4px;

    左下方邊框半徑:4px;

}

# .分頁> li:最後一個孩子> a,

.分頁> li:最後一個孩子> span {

    右上方邊框半徑:4px;

    右下方邊框半徑:4px;

##}

#.pagination > ;力> a:hover,

.分頁>力>跨距:懸停,

.分頁>力> a:焦點,

.分頁>力> span:focus {

    z-index: 2;

    顏色: #23527c;

    背景顏色: #eee;

    邊框顏色: #ddd ;

}

.分頁> .活動> a,

.分頁> .活動>跨度,

.分頁> .活動> a:hover,

.分頁> .活動>跨距:懸停,

.分頁> .活動> a:焦點,

.分頁> .活動> span:focus {

    z-index: 3;

    顏色: #fff;

    遊標: 預設;

###    背景顏色: #337ab7; # #####    邊框顏色:#337ab7;######}######.pagination > .禁用>跨度,######.分頁> .禁用>跨距:懸停,######.分頁> .禁用>跨距:焦點,######.分頁> .禁用> a,######.分頁> .禁用> a:hover,######.分頁> .禁用> a:focus {######    顏色:#777;######    遊標:不允許;######    背景顏色:#fff;######    邊框顏色: #ddd; ######}###

十、模版分頁範例

參數#說明
list_rows 
#每頁數量
page 目前頁
pathurl路徑
query ######url額外參數#############fragment ######url錨點########## ####var_page ######分頁變數#############

controller代碼

public function index(){

    $title = '商城';

    $login = '歐陽克';

    # 左側選單

    $menu = Db::table('shop_menu')->where('fid',0)->select();

#    $ left = $menu->toArray();

    foreach($left as &$left_v){

        $left_v['lists'] = Db::table('shop_menu') ->where('fid',$left_v['id'])->select();

    }

    # 右側清單

    $param = Request::param();

    if(isset($param['status']) && $param['status'] == 1){

        $where['status' ] = 1;

    }else if(isset($param['status']) && $param['status'] == 2){

#        $where['status'] = 2;

    }else{

        $where = true;

    }

    $p = isset($param['p'])

    $p = isset($param['p'])

    $p = isset($param['p'])

    $p = isset($param['p'])

    $p = isset($param['p'])

    $p = isset($param['p'])

    $p = isset($param['p'])

    $p = isset($param['p'])

    $p =. $param['p'] : 1;

    # thinkphp 自帶分頁

    $list = Db::table('shop_goods')

            -> $where)

            ->order('add_time DESC')

            ->order('id DESC0)

# .

                'list_rows'=> 10,

                'query' => Request::param()## :: $list- >toArray();

    foreach($right as &$right_v){

        $right_v['cat'] = Db::table('shop_cat')->where( 'id',$right_v['cat'])->value('name');

    }

    View::assign([

        'title' => $title,

        'login' => $login,

        'left' => $left,

##   right left' => $left,

##   right left' =>; ,

        'list' => $list,

        'status' => isset($param['status']) ? $param['status'] : 0

########################################################################################################'# ####    ]);######    return View::fetch();######}#########view程式碼##########< div>{$paginate|raw}</div>

十一、SQL 偵錯

  • getLastSql 輸出上次執行的sql語句

  • ##getLastSql 方法只能取得最後執行的SQL 記錄

  • $select = Db::table('shop_goods')->select();
    echo Db::getLastSql();
  • fetchSql 方法直接傳回目前的SQL 而不執行

  • $select = Db::table('shop_goods')->fetchSql()->select();
    echo $select;
十二、動態設定資料庫

  • config目錄database.php檔案

return [

    'connections' => [

        'ouyangke' => [

      #     資料庫類型  

            'type'              => Env::get('database.type', 'mysql'),

##        => Env:: get('數據。  // 用戶姓名

##            'username'          => Env::get('database.username', 'root'),

         => Env::get('database.password', 'root'),

            // 連接埠

            'hostport'    base < '),

            // 資料庫連接參數

##            'params'                   'charset '           => Env::get('database.charset', 'utf8'),

            //. ('database .prefix', 'shop_'),

            // 資料庫部署方式:0 集中式(單一伺服器),1 分散式(主從伺服器)

        ,

            // 資料庫讀寫是否分離主從式有效

            'rw_separate'                ' master_num'        => 1,

##卷  // 是否嚴格檢查欄位是否有

            'fields_strict'     => true,

            // 是否需要斷線重連

##             // 監聽SQL

            'trigger_sql'       => true,

            // 開始

#            // 欄位快取路徑

            'schema_cache_path' => app()->getRuntimePath() . 'schema' . DIRECTORY_SEPARATOR,##>

ouyangke資料庫中的shop_user表

CREATE TABLE `shop_user` (

    `uid ` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '用戶ID',

    `account` varchar(50) NOT NULL COMMENT '帳戶',

    `password` char(32) NOT NULL COMMENT '密碼',

    `name` varchar(50) NOT NULL COMMENT '姓名',

    `status` tinyint(1) unsigned NOT NULL DEFAULT '1' COMMENT '狀態1開啟2關',

    `add_time` int(10) unsigned NOT NULL COMMENT '新增時間',
        PRIMARY KEY (`uid`)
  • #) ENGINE=MyISAM AUTO_INCREMENT =3 DEFAULT CHARSET=utf8mb4 COMMENT='後台管理員';

#connect

方法動態設定資料庫連線資訊

Db::connect('ouyangke')->table('shop_user')->select();

connect
方法必須在查詢的最開始調用,而且必須緊跟著調用查詢方法,否則可能會導致部分查詢失效或仍然使用預設的資料庫連接

    十三、WHRER 鍊式運算(不常用)

    • 和查詢運算式功能一樣,ThinkPHP 提供以下快速查詢方法

    ##whereOr *用於OR查詢字串、陣列和物件#whereLike*模糊查詢字串whereNotLike*模糊查詢字串whereBetween*區間查詢字串whereNotBetween*不在區間查詢 字串#whereIn*IN查詢字串#whereNotIn*#不在IN查詢#字串whereNull*查詢欄位是否為NULL#字串## whereNotNull*#whereExists*
    連貫運算作用#支援的參數類型
    查詢欄位是否不是NULL字串
    EXISTS查詢#字元串
    whereNotExists* 不在EXISTS查詢#字串
    whereBetweenTime*#時間區間比較字串
    whereTime*用於時間日期的快速查詢字串
    whereExp* 表達式查詢,支援SQL語法字串
    whereFindInSet*#FIND_IN_SET查詢字串
    whereRaw*用於字串條件直接查詢和運算字串
    #

    十四、其他鍊式運算(不常用)

    ##支援的參數型別alias 用於定義目前資料表定義別名 字串strict #用於設定是否嚴格偵測欄位名稱是否存在 布林值#group #用於查詢的group支援字串having 用於對查詢的having支援字串 join*用於對查詢的join支援#字串和陣列#union*用於對查詢的union支援字串、陣列和物件distinct 用於查詢的distinct支援布林值lock 用於資料庫的鎖定機制布林值cache 用於查詢快取支援多個參數comment 用於SQL註解
    連貫運算作用 
    ##字串#
    force 用於資料集的強制索引字串
    #partition #用於設置分區資訊陣列字串
    failException 用於設定沒有查詢到資料是否拋出異常布林值
    sequence 用於設定自增序列名稱
    #replace 用於設定使用REPLACE方式寫入布林值
    extra #用於設定額外查詢規則字元字串
    duplicate 用於設定DUPLCATE資訊陣列字串
    procedure  用於設定目前查詢是否為預存程序查詢布林值
    #master #用於設定主伺服器讀取資料布林值
    view*用於檢視查詢 字串、陣列

    十五、交易操作

    • InnoDB引擎支援交易處理,MyISAM不支援交易處理

    // 启动事务
    Db::startTrans();
    $data = ['cat'=>'1','title'=>'日系小浪漫与温暖羊毛针织拼接网纱百褶中长收腰连衣裙','price'=>'1598.35','add_time'=>1576080000];
    $insert = Db::table('shop_goods')->insert($data);
    if(empty($insert)){
        // 回滚事务
        Db::rollback();
    }else{
        // 提交事务
        Db::commit();
    }
    • transaction 方法操作資料庫事務,當閉包中的程式碼發生異常會自動回滾

    Db::transaction(function () {
        $data = ['cat'=>'1','title'=>'日系小浪漫与温暖羊毛针织拼接网纱百褶中长收腰连衣裙','price'=>'1598.35','add_time'=>1576080000];
        $insert = Db::table('shop_goods')->insert($data);
    });

    十六、資料集

    • 資料庫透過select查詢,得到的資料集物件

    • 傳回的資料集物件是 think\Collection,提供了和陣列無差別用法,並且另外封裝了一些額外的方法

    ##1 isEmpty是否為空白2 toArray 轉換為陣列#3 all 所有資料#4 merge 5 6 7 #8 9 10 ##20 order 指定欄位排序#22 23 24 25 26 27 #28 2930
    編號方法#描述
    ##合併其它資料
    diff 比較數組,回傳差集
    #flip 交換資料中的鍵與值
    #intersect 比較數組,傳回交集
    keys #所有傳回資料中的鍵名稱
    pop  刪除資料中的最後一個元素
    #shift #刪除資料中的第一個元素
    11 unshift 在資料開頭插入一個元素
    12 push 在結尾插入一個元素
    13 reduce 透過使用使用者自訂函數,以字串傳回陣列
    #14 reverse 資料倒序重排
    15 chunk 資料分隔為多個資料區塊
    16 each 給資料的每個元素執行回呼
    17 filter 用回呼函數過濾資料中的元素
    18 column 傳回資料中的指定列
    19sort對資料排序
    21 shuffle 將資料打亂
    22 slice 
    slice 截取資料中的一部份
    map#用回呼函數處理陣列中的元素
    where 依照欄位條件篩選陣列中的元素
    whereLikeLike查詢篩選元素
    whereNotLike Not Like篩選元素
    #whereIn IN查詢篩選陣列中的元素
    whereNotIn #Not IN查詢篩選陣列中的元素
    whereBetween #Between查詢過濾陣列中的元素
    whereNotBetween######Not Between查詢過濾陣列中的元素#############
    $select = Db::table('shop_goods')
                ->field('title,price,id')
                ->where('status',1)
                ->order('price','DESC')
                ->select();
    if($select->isEmpty()){
        echo '未查询到数据';
    }else{
        print_r($select->toArray());
    }

    備:在模型中進行資料集查詢,全部傳回資料集對象,但使用的是think\model\Collection類別(繼承think\Collection),但用法是一致的。