以下由thinkphp教學專欄跟大家介紹ThinkPHP 資料庫操作之增刪改查,希望對需要的朋友有幫助!
基本上使用
可以直接使用資料庫執行原生SQL操作了,支援query (查詢操作)和execute (寫入操作)方法,並且支援參數綁定。
Db::query('select * from think_user where id=?',[8]); Db::execute('insert into think_user (id, name) values (?, ?)',[8,'thinkphp']);
也支援命名佔位符綁定,例如:
Db::query('select * from think_user where id=:id',['id'=>8]); Db::execute('insert into think_user (id, name) values (:id, :name)',['id'=>8,'name'=>'thinkphp']);
可以使用多個資料庫連接,使用
Db::connect($config)->query('select * from think_user where id=:id',['id'=>8]);
config是一個單獨的資料庫配置,支援數組和字串,也可以是一個資料庫連接的設定參數名。
查詢資料
#基本查詢
##查詢一個資料使用:
// table方法必须指定完整的数据表名 Db::table('think_user')->where('id',1)->find();
find 方法查詢結果不存在,回傳null
查詢資料集使用:
Db::table('think_user')->where('status',1)->select();
select 方法查詢結果不存在,傳回空數組
如果設定了資料表前綴參數的話,可以使用
Db::name('user')->where('id',1)->find(); Db::name('user')->where('status',1)->select();
如果你的資料表沒有使用表格前綴功能,那麼name和table方法的一樣的效果。
在 find 和 select 方法之前可以使用所有的鍊式運算方法。 預設情況下,find和select方法回傳的都是陣列。
助手函數
#系統提供了一個db 助手函數,可以更方便的查詢:
db('user')->where('id',1)->find(); db('user')->where('status',1)->select();
注意:使用db助手函數預設每次都會重新連接資料庫,而使用Db::name 或Db::table 方法的話都是單例的。 db函數如果需要採用相同的鏈接,可以傳入第三個參數,例如:db('user',[],false)->where('id',1)->find();
db('user',[],false)->where('status',1)->select();
上面的方式會使用同一個資料庫連接,第二個參數為資料庫的連接參數,留空表示採用資料庫設定檔的配置。
使用Query物件或閉包查詢
#或使用查詢物件進行查詢,例如:$query = new \think\db\Query();$query->table('think_user')->where('status',1);
Db::find($query);
Db::select($query);
或直接使用閉包函數查詢,例如:
Db::select(function($query){ $query->table('think_user')->where('status',1); });
值和列查詢
查詢某個欄位的值可以用
// 返回某个字段的值
Db::table('think_user')->where('id',1)->value('name');
#查詢某一列的值可以用// 返回数组
Db::table('think_user')->where('status',1)->column('name');
// 指定索引
Db::table('think_user')->where('status',1)->column('name','id');
資料集分批處理
如果你需要處理成千上萬筆資料庫記錄,可以考慮使用chunk方法,該方法一次取得結果集的一小塊,然後填入每一小塊資料到要處理的閉包,該方法在編寫處理大量資料庫記錄的時候非常有用。 例如,我們可以全部用戶表資料進行分批處理,每次處理100 個用戶記錄:Db::table('think_user')->chunk(100, function($users) { foreach ($users as $user) {
//查询数据
}
});// 或者交给回调方法
myUserIterator处理
Db::table('think_user')->chunk(100, 'myUserIterator');
你可以透過從閉包函數中傳回false來中止對資料集的處理:
Db::table('think_user')->chunk(100, function($users) { // 处理结果集... return false; });
也支援在chunk方法之前呼叫其它的查詢方法,例如:Db::table('think_user')->where('score','>',80)->chunk(100,function($users) { foreach ($users as $user) {
//
}
});
JSON類型資料查詢(mysql V5.0.1)
// 查询JSON类型字段 (info字段为json类型)
Db::table('think_user')->where('info$.email','thinkphp@qq.com')->find();
新增資料
#新增一條資料
##使用Db 類別的insert 方法向資料庫提交資料
###$data = ['foo' => 'bar', 'bar' => 'foo']; Db::table('think_user')->insert($data);###如果你在database.php 設定檔中配置了資料庫前綴( prefix ),那麼可以直接使用Db 類別的name 方法提交資料###
Db::name('user')->insert($data);### ###insert 方法加入資料成功回傳新增成功的條數,insert 正常狀況回傳1######
添加数据后如果需要返回新增数据的自增主键,可以使用 getLastInsID 方法:
Db::name('user')->insert($data);$userId = Db::name('user')->getLastInsID();
或者直接使用 insertGetId 方法新增数据并返回主键值:
Db::name('user')->insertGetId($data);
insertGetId 方法添加数据成功返回添加数据的自增主键
添加多条数据
添加多条数据直接向 Db 类的 insertAll 方法传入需要添加的数据即可
$data = [ ['foo' => 'bar', 'bar' => 'foo'], ['foo' => 'bar1', 'bar' => 'foo1'], ['foo' => 'bar2', 'bar' => 'foo2'] ]; Db::name('user')->insertAll($data);
insertAll 方法添加数据成功返回添加成功的条数
助手函数
// 添加单条数据 db('user')->insert($data); // 添加多条数据 db('user')->insertAll($list);
快捷更新
V5.0.5+ 以上版本封装的快捷更新方法 data ,可以配合 insert 使用。
下面举个例子说明用法:
Db::table('data')->data(['name'=>'tp','score'=>1000])->insert();
更新数据
更新数据表中的数据
Db::table('think_user')->where('id', 1)->update(['name' => 'thinkphp']);
如果数据中包含主键,可以直接使用:
Db::table('think_user')->update(['name' => 'thinkphp','id'=>1]);
update 方法返回影响数据的条数,没修改任何数据返回 0
如果要更新的数据需要使用 SQL 函数或者其它字段,可以使用下面的方式:
Db::table('think_user')->where('id', 1)->update([ 'login_time' => ['exp','now()'], 'login_times' => ['exp','login_times+1'],]);
更新某个字段的值
Db::table('think_user') ->where('id',1) ->setField('name', 'thinkphp');
setField 方法返回影响数据的条数,没修改任何数据字段返回 0
自增或自减一个字段的值
setInc/setDec 如不加第二个参数,默认值为1
// score 字段加 1 Db::table('think_user') ->where('id', 1) ->setInc('score'); // score 字段加 5 Db::table('think_user') ->where('id', 1) ->setInc('score', 5); // score 字段减 1 Db::table('think_user') ->where('id', 1) ->setDec('score'); // score 字段减 5 Db::table('think_user') ->where('id', 1) ->setDec('score', 5);
延迟更新
setInc/setDec 支持延时更新,如果需要延时更新则传入第三个参数
下例中延时10秒,给 score 字段增加1
Db::table('think_user')->where('id', 1)->setInc('score', 1, 10);
setInc/setDec 方法返回影响数据的条数
助手函数
// 更新数据表中的数据 db('user')->where('id',1)->update(['name' => 'thinkphp']); // 更新某个字段的值 db('user')->where('id',1)->setField('name','thinkphp'); // 自增 score 字段 db('user')->where('id', 1)->setInc('score'); // 自减 score 字段 db('user')->where('id', 1)->setDec('score');
快捷更新( V5.0.5+ )
V5.0.5+ 以上版本封装的 data 、 inc 、 dec 和 exp 方法属于链式操作方法,可以配合 update 使 用。
下面举个例子说明用法:
Db::table('data')->where('id',1)->inc('read')->dec('score',3)->exp('name','UPPER(name)')->update();
删除数据
删除数据表中的数据
// 根据主键删除 Db::table('think_user')->delete(1); Db::table('think_user')->delete([1,2,3]); // 条件删除 Db::table('think_user')->where('id',1)->delete(); Db::table('think_user')->where('id','<',10)->delete();
delete 方法返回影响数据的条数,没有删除返回 0
助手函数
// 根据主键删除 db('user')->delete(1); // 条件删除 db('user')->where('id',1)->delete();
以上是ThinkPHP 資料庫操作之增刪改查的詳細內容。更多資訊請關注PHP中文網其他相關文章!