《TP5.0學習筆記---對Mysql數據庫的操作(二)》

聲明:本篇博客所使用的數據庫及表還是上篇博客中的數據庫和表(http://blog.csdn.net/self_realian/article/details/78560456)

一、 數據庫添加操作
在上一篇博客中,我們通過Db類中的query()和execute()方法,使用SQL語句的方式向數據庫中添加的數據。下邊我們學習一下它的其它插入方式:

$db = Db::name('user');
        //1,insert()方法,返回值是影響記錄的行數,也就是插入數
        $res = $db->insert([
            'email'     => '[email protected]',
            'password'  => md5('shulv_01'),
            'username'  => 'shulv_01'
        ]);
        dump($res);

這裏寫圖片描述
因爲在我們的編程過程中,一般都是幾個庫表相互關聯的,我們在插入之後需要獲取它的自增長id,如果我們使用insert()方法,我們無法獲取自增的id,我們可能需要更多的操作才能得到。那麼,thinkphp的Db類爲我們提供了insertGetId()方法

//insertGetId()返回自增id
$res = $db->insertGetId([
            'email'     => '[email protected]',
            'password'  => md5('shulv_02'),
            'username'  => 'shulv_02'
        ]);
        dump($res);

我刷新了兩次,所以顯示結果如下:
這裏寫圖片描述
那麼,當我們需要插入多條記錄時,我們可以通過下邊這個方法

//insertAll()返回的也是插入成功記錄的條數
$db = Db::name('user');

        $data = [];
        for($i=0; $i<10; $i++){
            $data[] = [
                'email'    => "shulv_03_{$i}@qq.com",
                'password' => md5("shulv_03_{$i}"),
                'username' => "shulv_03_{$i}"
            ];
        }
        $res = $db->insertAll($data);
        dump($res);

這裏寫圖片描述

二、 數據庫更新操作
在更新記錄之前,我先將原來的記錄清空了,然後重新插入30條記錄(還是使用insertAll()方法)

$db = Db::name('user');

       //update() 在使用這個函數的時候我們必須傳遞where條件,否則會報錯。如果我們想更新全部,我們可以給where條件傳遞類似1=1的恆等條件
        $res = $db->where([
            'id'        => 21
        ])->update([
            'username'  => '3404767031'//下邊還可以繼續添加更新的字段
            //'email'   => '[email protected]'
        ]);
        dump($res);

這裏寫圖片描述
如果我們僅想對錶的某一個字段進行更新,我們就可以使用setField()方法

//setField()   僅對錶中的某一個字段進行修改  返回結果也是受影響記錄的行數
        $res = $db -> where([
            'id'   => 22
        ]) -> setField('username', '3404767031');
        dump($res);

這裏寫圖片描述
它和update()的區別就是,它每次只更新一個字段,而uodate()可以更新一個字段,也可以更新多個字段

爲了說下邊一個setInc()函數,我給表添加了一個num字段,類型爲整形無符號

//setInc()  返回值仍然是受影響條數
        $res = $db -> where([
            'id'   => 21
        ]) -> setInc('num', 5);//如果我們只傳遞字段名,那麼每刷新一次,該記錄的該字段都會自增1。如果傳遞第二個參數,那麼每次都會增加你傳遞的第二個參數
        dump($res);

下邊還有一個setDec(),它與setInc()用法相同,效果相反,它是自減的。這裏就不再舉例了

三、 數據庫刪除操作
記錄的刪除,使用的是delete()方法

$db = Db::name('user');

        $res = $db->where([
            'id'   => 21
        ])->delete();
        dump($res);

這裏寫圖片描述
其實,如果你傳遞的where條件是表中的主鍵,那麼你可以直接這樣寫

$db -> delete(id);
$db = Db::name('user');

        $res = $db->delete(22);
        dump($res);

這裏寫圖片描述
當我們沒有傳遞任何參數,也沒有給where條件的時候,執行會報錯,因爲一般情況下我們是不會刪除所有數據的,如果真的想刪除所有,那麼我們可以傳遞給where一個字符串”1=1”

$db = Db::name('user');

        $res = $db->where("1=1")->delete();
        dump($res);

這裏寫圖片描述
四、 條件構造器
在前邊說查詢和刪除的時候,使用db類,我們都需要傳遞where條件,那我們說一下where條件到底如何來編寫:
之前我們傳遞的where條件,一直是一個數組,db類爲我們提供了buildSql()方法,它會返回我們當前的SQL語句

$sql = $db->where([
            'id' => 1
        ])->buildSql();
//當然我們也可以通過傳遞字符串的方式給where傳遞條件,例如:where("id = 1")
        dump($sql);

這裏寫圖片描述
如果我們在給where傳遞參數的時候,不想以傳遞一個參數的這種方式時,使用傳遞兩個參數的方式,我們可以將第一個參數傳遞爲字段名,第二個爲字段的值。 當我們想查詢id不等於1的這條記錄,那麼我們就需要再添加一個參數,第一個參數還是字段名,第二個參數是表達式(<>:不等於 ),第三個參數爲我們要判斷的值

$db = Db::name('user');

        /*
            這個條件表達式有哪些(不區分大小寫):
            EQ: =
            NEQ: <>
            LT: <
            ELT: <=
            GT: >
            EGT: >=
            BETWEEN:
            BETWEEN * AND *:
            NOTBETWEEN:
            NOTBETWEEN * AND *:
            IN:
            IN (*,*):
            NOTIN:
            NOTIN (*,*):
        */
        $sql1 = $db->where("id", 1)->buildSql();
        $sql2 = $db->where("id", "NEQ", 1)->buildSql();//這裏直接寫<>也是可以的,其餘幾個也是這樣,也可以直接寫符號
        $sql3 = $db->where("id", "between", "1,5")->buildSql();//第三個參數也可以使用數組的方式,[1,5]
        $sql4 = $db->where("id", "in", "1,5,6,7,8")->buildSql();//同樣,第三個參數也可以是數組

        //如果我們還想和以前一樣通過數組的方式,那麼我們可以這樣寫
        $sql5 = $db->where([
            'id'   => ['eq', 1]//其他的都可以這樣寫
        ])->buildSql();
        //如果,你想傳遞多個條件,即條件之間是AND的關係,那麼可以接着寫
        $sql6 = $db->where([
            'id'       => ['eq', 1],
            'username' => '[email protected]'
        ])->buildSql();

        //如果我們想通過上邊那種字符串的方式傳遞多個條件時,可以寫多個where
        $sql7 = $db
        ->where("id", "not in", [1,2,3,4])
        ->where("username", "eq", "3404767031")
        ->buildSql();
        //如果兩個條件是"或"的關係,我們可以使用whereOr();
        $sql8 = $db
        ->where("id", "not in", [1,2,3,4])
        ->whereOr("username", "eq", "3404767031")
        ->buildSql();
        dump($sql1);
        dump($sql2);
        dump($sql3);
        dump($sql4);
        dump($sql5);
        dump($sql6);
        dump($sql7);
        dump($sql8);

這裏寫圖片描述
如果我們手寫這個SQL語句,將會消耗我們大量的精力,那麼使用這種直接構造sql語句的方式,會節省我們大量的時間和精力
五、 鏈式操作
鏈式操作其實就是執行完db類的一個方法之後,返回的結果其實還是一個db類,這樣,它就可以連續的調用多個方法。其實這個都是很好理解的

$db = Db::name('user');

        $res = $db
        ->where("id",">",60)
        ->field("username","id")//如果我們不想輸出所有字段,我們可以通過該方法指定輸出哪些字段
        ->order("id DESC")//倒序輸出
        ->limit(3, 5)//限制輸出的條數,表示從第三條開始返回,一共返回五條
        ->select();
        dump($res);

這裏寫圖片描述
如果大家還想了解更多關於鏈式操作的方法,可以參考官方手冊進行了解

希望這些對小夥伴們有所幫助,互相學習,共同進步 ^_^

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章