ThinkPhp 常用資料庫操作
阿新 • • 發佈:2018-11-12
原生sql語句
use think\Db; 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']);
查詢構造器
查詢方法 | 作用描述 |
---|---|
table | 指定查詢資料表 |
field | 指定查詢欄位 |
where | 指定查詢條件 |
order | 指定結果排序 |
limit | 指定查詢結果數 |
find | 查詢一條記錄 |
select | 查詢資料集 |
insert | 寫入資料 |
update | 更新資料 |
delete | 刪除資料 |
需要注意的是,上述的查詢方法中find,select,insert,update,delete都是查詢操作,其他的都是輔助操作,輔助操作返回的是個物件,支援鏈式呼叫。但一旦執行了查詢操作,就不能繼續呼叫了。
不同的輔助操作,先後順序沒影響。 Db::table('banner')->where('id', '>', '2')->order('update_time asc')->select(); Db::table('banner')->order('update_time asc')->where('id', '>', '2')->select(); 相同的查詢操作,先後順序有影響。 $list = Db::table('data') ->where('id', '>', 1) ->where('name', 'like', '%think%') ->order('id', 'desc') ->order('create_time', 'desc') ->limit(8) ->select(); $list = Db::table('data') ->where('name', 'like', '%think%') ->where('id', '>', 1) ->order('create_time', 'desc') ->order('id', 'desc') ->limit(8) ->select();
Db與模型
區別
使用Db操作返回的是陣列,使用模型返回的是物件。
想要使得模型物件可以連貫操作,可以在database.php中進行配置
'resultset_type' =>'\think\Collection'
#即可連貫操作
model('user')->select()->toArray()
增
Db:
Db::table('user')->insert([
'name' => 'spawn',
'email' => '[email protected]'
])
模型:
$user = new User;
$user->save([
'name' => 'spawn',
'email' => '[email protected]'
])
$user = User::create([
'name' => 'sapwn',
'email' => '[email protected]'
])
save(動態) 返回: 影響的記錄數
create(靜態) 返回:模型物件例項 (可以直接呼叫方法)
#增加一條資料
$data = ['foo' => 'bar', 'bar' => 'foo'];
Db::table('think_user')->insert($data);
Db::name('user')->insert($data);
#新增資料後如果需要返回新增資料的自增主鍵,可以使用getLastInsID方法:
Db::name('user')->insert($data);
$userId = Db::name('user')->getLastInsID();
#或者直接使用insertGetId方法新增資料並返回主鍵值:
#insertGetId 方法新增資料成功返回新增資料的自增主鍵
Db::name('user')->insertGetId($data);
#新增多條資料
$data = [
['foo' => 'bar', 'bar' => 'foo'],
['foo' => 'bar1', 'bar' => 'foo1'],
['foo' => 'bar2', 'bar' => 'foo2']
];
Db::name('user')->insertAll($data);
#insertAll 方法新增資料成功返回新增成功的條數
db('user')->insertAll($list);
#快捷操作
Db::table('data')
->data(['name'=>'tp','score'=>1000])
->insert();
刪
// 根據主鍵刪除
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();
$user = User::get(1);
$user->delete();
#或者
User::destory(1);
改
Db:
#update 方法返回影響資料的條數,沒修改任何資料返回 0
Db::table('user')->where('id', 1)->update([
'name' => 'haha',
'email' => '[email protected]'
])
#更新某個欄位的值
#setField 方法返回影響資料的條數,沒修改任何資料欄位返回 0
Db::table('think_user')->where('id',1)->setField('name', 'thinkphp');
#自增或自減一個欄位的值,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);
助手函式
// 更新資料表中的資料
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');
#快捷操作
Db::table('data')
->where('id',1)
->inc('read')
->dec('score',3)
->exp('name','UPPER(name)')
->update();
模型:
$user = User::get(1);
$user->save([
'name' => 'haha',
'email' => '[email protected]'
])
或者
User::update([
'name' => 'topthink',
'email' => '[email protected]',
], ['id' => 1]);
#save 更新資料 影響的記錄數
#update 更新資料(靜態) 返回模型物件例項
查
// table方法必須指定完整的資料表名
find 方法查詢結果不存在,返回 null
$user = Db::table('user')->where('id', 1)->find();
$user = User::get(1);
select 方法查詢結果不存在,返回空陣列
Db::table('think_user')->where('status',1)->select();
//如果設定了資料表字首引數的話,可以使用
Db::name('user')->where('id',1)->find();
Db::name('user')->where('status',1)->select();
//助手函式
db('user')->where('id',1)->find();
db('user')->where('status',1)->select();
//query閉包
Db::select(function($query){
$query->table('think_user')->where('status',1);
});
// 返回某個欄位的值
Db::table('think_user')->where('id',1)->value('name');//不存在返回null
#查詢某一列的值可以用,不存在返回空陣列
// 返回陣列
Db::table('think_user')->where('status',1)->column('name');
// 指定索引
Db::table('think_user')->where('status',1)->column('name','id');
Db::table('think_user')->where('status',1)->column('id,name'); // 同tp3的getField
#資料分批處理
Db::table('think_user')->chunk(100, function($users) {
foreach ($users as $user) {
//
}
});
// 或者交給回撥方法myUserIterator處理
Db::table('think_user')->chunk(100, 'myUserIterator');
鏈式操作
#使用字串條件的時候,建議配合預處理機制,確保更加安全
Db::table('think_user')->where("id=:id and username=:name")->bind(['id'=>[1,\PDO::PARAM_INT],'name'=>'thinkphp'])->select();
#alias用於設定當前資料表的別名,便於使用其他的連貫操作例如join方法等。
Db::table('think_user')->alias('a')->join('__DEPT__ b ','b.user_id= a.id')->select();
#SELECT * FROM think_user a INNER JOIN think_dept b ON b.user_id= a.id
Db::table('think_user')->alias(['think_user'=>'user','think_dept'=>'dept'])->join('think_dept','dept.user_id= user.id')->select();
#SELECT * FROM think_user user INNER JOIN think_dept dept ON dept.user_id= user.id
#field
Db::table('think_user')->field('id,title,content')->select();
#SELECT id,title,content FROM table
Db::table('think_user')->field('id,nickname as name')->select();
#SELECT id,nickname as name FROM table
Db::table('think_user')->field('id,SUM(score)')->select();
Db::table('think_user')->field(['id','title','content'])->select();
Db::table('think_user')->field(['id','nickname'=>'name'])->select();
Db::table('think_user')->field(['id','concat(name,"-",id)'=>'truename','LEFT(title,7)'=>'sub_title'])->select();
Db::table('think_user')->where('status=1')->order('id desc')->limit(5)->select();
Db::table('think_user')->where('status=1')->order(['order','id'=>'desc'])->limit(5)->select();
Db::table('think_user')
->where('status=1')
->field('id,name')
->limit(10)
->select();
Db::table('think_article')->limit('10,25')->select();
Db::table('think_article')->page('2,10')->select();
Db::table('think_user')
->field('user_id,test_time,username,max(score)')
->group('user_id,test_time')
->select();
Db::table('think_user')
->field('username,max(score)')
->group('user_id')
->having('count(test_time)>3')
->select();
Db::table('think_artist')
->alias('a')
->join('think_work w','a.id = w.artist_id')
->join('think_card c','a.card_id = c.id')
->select();
Db::table('think_user')->distinct(true)->field('user_login')->select();
#SELECT DISTINCT user_login FROM think_user
子查詢
#使用select方法,當select引數為false時,表示不進行查詢只是構建sql
$subQuery =Db::table('think_user')->field('id,name')->where('id','>',10)->select(false);
#結果是SELECT `id`,`name` FROM `think_user` WHERE `id` > 10
#使用fetchSql,fetchSql表示不進行查詢只是返回構建的sql
$subQuery = Db::table('think_user')->field('id,name')->where('id','>',10)->fetchSql(true)->select();
#SELECT `id`,`name` FROM `think_user` WHERE `id` > 10
#使用buildSql,構建子查詢
$subQuery =Db::table('think_user')->field('id,name')->where('id','>',10)->buildSql();
#結果是( SELECT `id`,`name` FROM `think_user` WHERE `id` > 10 )
#呼叫buildSql方法後不會進行實際的查詢操作,而只是生成該次查詢的SQL語句(為了避免混淆,會在SQL兩邊加上括號),然後我們直接在後續的查詢中直接呼叫
#需要注意的是,使用前兩種方法需要自行新增‘括號’。
#使用閉包構建子查詢
#IN/NOT IN和EXISTS/NOT EXISTS之類的查詢可以直接使用閉包作為子查詢,例如
Db::table('think_user')->where('id','in',function($query){
$query->table('think_profile')->where('status',1)->field('id');
})->select();
#SELECT * FROM `think_user` WHERE `id` IN ( SELECT `id` FROM `think_profile` WHERE `status` = 1 )
Db::table('think_user')->where(function($query){
$query->table('think_profile')->where('status',1)
},'exists')->select();
#SELECT * FROM `think_user` WHERE EXISTS ( SELECT * FROM `think_profile` WHERE `status` = 1 )
模型
查詢
#多條件查詢
$where['rc_category_id'] = array('eq',$cid);
$where['rc_territory_ids'] = ['like', '%'.$tid.'%'];
$lawyer = Talents::where($where)->limit(16)->select();
# where(['a'=>['=','100'],'b'=>['<>','c']])