聲明:本篇部落格所使用的資料庫及表還是上篇部落格中的資料庫和表(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=; $i<; $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' =>
])->update([
'username' => '3404767031'//下邊還可以繼續添加更新的字段
//'email' => '[email protected]'
]);
dump($res);
如果我們僅想對表的某一個字段進行更新,我們就可以使用setField()方法
//setField() 僅對表中的某一個字段進行修改 傳回結果也是受影響記錄的行數
$res = $db -> where([
'id' =>
]) -> setField('username', '3404767031');
dump($res);
它和update()的差別就是,它每次隻更新一個字段,而uodate()可以更新一個字段,也可以更新多個字段
為了說下邊一個setInc()函數,我給表添加了一個num字段,類型為整形無符号
//setInc() 傳回值仍然是受影響條數
$res = $db -> where([
'id' =>
]) -> setInc('num', );//如果我們隻傳遞字段名,那麼每重新整理一次,該記錄的該字段都會自增1。如果傳遞第二個參數,那麼每次都會增加你傳遞的第二個參數
dump($res);
下邊還有一個setDec(),它與setInc()用法相同,效果相反,它是自減的。這裡就不再舉例了
三、 資料庫删除操作
記錄的删除,使用的是delete()方法
$db = Db::name('user');
$res = $db->where([
'id' =>
])->delete();
dump($res);
其實,如果你傳遞的where條件是表中的主鍵,那麼你可以直接這樣寫
$db -> delete(id);
$db = Db::name('user');
$res = $db->delete();
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' =>
])->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", )->buildSql();
$sql2 = $db->where("id", "NEQ", )->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', ]//其他的都可以這樣寫
])->buildSql();
//如果,你想傳遞多個條件,即條件之間是AND的關系,那麼可以接着寫
$sql6 = $db->where([
'id' => ['eq', ],
'username' => '[email protected]'
])->buildSql();
//如果我們想通過上邊那種字元串的方式傳遞多個條件時,可以寫多個where
$sql7 = $db
->where("id", "not in", [,,,])
->where("username", "eq", "3404767031")
->buildSql();
//如果兩個條件是"或"的關系,我們可以使用whereOr();
$sql8 = $db
->where("id", "not in", [,,,])
->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",">",)
->field("username","id")//如果我們不想輸出所有字段,我們可以通過該方法指定輸出哪些字段
->order("id DESC")//倒序輸出
->limit(, )//限制輸出的條數,表示從第三條開始傳回,一共傳回五條
->select();
dump($res);
如果大家還想了解更多關于鍊式操作的方法,可以參考官方手冊進行了解
希望這些對小夥伴們有所幫助,互相學習,共同進步 ^_^