ThinkPHP內置了抽象數據庫訪問層,把不一樣的數據庫操做封裝起來,咱們只須要使用公共的Db類進行操做,而無需針對不一樣的數據庫寫不一樣的代碼和底層實現,Db類會自動調用相應的數據庫驅動來處理。採用PDO方式,目前包含了Mysql、SqlServer、PgSQL、Sqlite等數據庫的支持。sql
配置了數據庫鏈接信息後,咱們就能夠直接使用數據庫運行原生SQL操做了,支持query
(查詢操做)和execute
(寫入操做)方法,而且支持參數綁定。數據庫
public function read() { $sql = Db::query('select * from news'); dump($sql); }
輸出的是:數組
execute方法:閉包
public function read() { $sql = Db::execute('insert into news (nid, rid) values (11, 11)');; dump($sql); }
輸出:spa
數據庫添加成功!3d
也支持命名佔位符綁定,例如:code
public function read() { $sql = Db::query('select * from news where nid=:nid',['nid'=>1]); dump($sql); }
輸出:blog
execute方法:get
public function read() { $sql = Db::execute('insert into news (nid, rid) values (:nid, :rid)',['nid'=>18,'rid'=>'121']); dump($sql); }
輸出:it
數據庫添加成功!
能夠使用多個數據庫鏈接:
聽名字就知道,很裝X..
先來看基本查詢;
查詢一個數據:
// table方法必須指定完整的數據表名
$sql =Db::table('news')->where('nid',1)->find(); dump($sql);
find = 查詢一條;而且查詢結果不存在,返回 null
輸出:
Db::table('think_user')->where('status',1)->select();
這條查詢語句與上面同效,可是select 方法查詢結果不存在,返回空數組
額 這個玩意叫查詢數據集,沒錯!
默認狀況下,find和select方法返回的都是數組。
若是你要查詢某個字段的值,咋整?
public function read() { // 返回某個字段的值
$sql =Db::table('news')->where('nid',18)->value('rid'); dump($sql); }
這樣看輸出,我求rid的值:
若是你須要處理成千上百條數據庫記錄,能夠考慮使用chunk方法,該方法一次獲取結果集的一小塊,而後填充每一小塊數據到要處理的閉包,該方法在編寫處理大量數據庫記錄的時候很是有用。
public function read() { $sql =Db::table('news')->chunk(1,function($user){ foreach($user as $u) { dump($u); } }); }
這個樣子 就能夠一條一條都給遍歷出來了!
是「一條一條·」,嘿!
使用 Db
類的 insert
方法向數據庫提交數據
public function read() { $data = ['ntitle' => '123', 'rid' => '456']; $sql = Db::table('news')->insert($data); dump($sql); }
添加成功後insert 方法返回添加成功的條數,insert 正常狀況返回 1
添加數據後若是須要返回新增數據的自增主鍵,能夠使用getLastInsID
方法:
public function read() { $data = ['ntitle' => '123', 'rid' => '345']; $sql = Db::table('news')->insert($data); $userId = Db::name('news')->getLastInsID('nid'); dump($userId); dump($sql); }
看輸出:
主鍵字段22!
添加多條數據:
添加多條數據直接向 Db 類的 insertAll 方法傳入須要添加的數據便可;
public function read() { $data = [ ['ntitle' =>'gaga','rid' => '12'], ['ntitle' =>'gaaaga','rid' => '123'] ]; $sql = Db::table('news')->insertAll($data); dump($sql); }
這樣的話,返回的應該是兩條2
刪除數據:
根據主鍵來刪除
public function read() { // 根據主鍵 來刪
$sql = Db::table('news')->delete(1); //多刪 //$sql = Db::table('news')->delete(1,2,3);
dump($sql); }
執行成功返回影響行數;
還有一種是根據條件來刪除的
public function read() { // 根據條件 來刪
$sql = Db::table('news')->where('nid',18)->delete(); //多刪 //$sql = Db::table('news')->where('nid','<',1)->delete();
dump($sql); }
執行成功也是返回影響行數;
where方法:
能夠使用where
方法進行AND
條件查詢:
public function read() { $sql = Db::table('news') ->where('nid',20) ->where('ntitle',123) ->find(); dump($sql); }
whereOr方法:
使用whereOr
方法進行OR
查詢:
public function read() { $sql = Db::table('news') ->where('nid',20) ->whereOr('ntitle','like','%123%') ->find(); dump($sql); }
混合查詢:
where方法和whereOr方法在複雜的查詢條件中常常須要配合一塊兒混合使用
public function read() { $sql = Db::table('news') ->where(function($query){ $query->where('nid',21)->where('nid',22); }) ->whereOr(function($query) { $query->where('ntitle','123')->whereOr('ntitle','123'); }) ->select(); dump($sql); }
輸出的是:
看一下生成的代碼:
SELECT * FROM `news` WHERE ( `nid` = 1 OR `nid` = 2 ) OR ( `ntitle` LIKE '123' OR `ntitle` LIKE '123' )
第一個查詢方法用where或者whereOr是沒有區別的。