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

猜你喜欢

转载自blog.csdn.net/benben0729/article/details/83475084