1. 程式人生 > >ThinkPhp 常用資料庫操作

ThinkPhp 常用資料庫操作

原生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']])