聲明:本篇博客所使用的數據庫及表還是上篇博客中的數據庫和表(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);
如果大家還想了解更多關於鏈式操作的方法,可以參考官方手冊進行了解
希望這些對小夥伴們有所幫助,互相學習,共同進步 ^_^