tp5增删改查(入门)

多数据库配置

我们可以在调用Db类的时候动态定义连接信息,例如:

Db::connect([
    // 数据库类型
    'type'        => 'mysql',
    // 数据库连接DSN配置
    'dsn'         => '',
    // 服务器地址
    'hostname'    => '127.0.0.1',
    // 数据库名
    'database'    => 'thinkphp',
    // 数据库用户名
    'username'    => 'root',
    // 数据库密码
    'password'    => '',
    // 数据库连接端口
    'hostport'    => '',
    // 数据库连接参数
    'params'      => [],
    // 数据库编码默认采用utf8
    'charset'     => 'utf8',
    // 数据库表前缀
    'prefix'      => 'think_',
]);

或者使用字符串方式:

Db::connect('mysql://root:1234@127.0.0.1:3306/thinkphp#utf8');

字符串连接的定义格式为:

数据库类型://用户名:密码@数据库地址:数据库端口/数据库名#字符集

注意:字符串方式可能无法定义某些参数,例如前缀和连接参数。

如果我们已经在应用配置文件(注意这里不是数据库配置文件)中配置了额外的数据库连接信息,例如:

//数据库配置1
'db_config1' => [
    // 数据库类型
    'type'        => 'mysql',
    // 服务器地址
    'hostname'    => '127.0.0.1',
    // 数据库名
    'database'    => 'thinkphp',
    // 数据库用户名
    'username'    => 'root',
    // 数据库密码
    'password'    => '',
    // 数据库编码默认采用utf8
    'charset'     => 'utf8',
    // 数据库表前缀
    'prefix'      => 'think_',
],
//数据库配置2
'db_config2' => 'mysql://root:1234@localhost:3306/thinkphp#utf8';

我们可以改成

Db::connect('db_config1');
Db::connect('db_config2');

支持直接使用数据库连接的配置名称,例如:

//在模型里单独设置数据库连接信息
namespace app\index\model;

use think\Model;

class User extends Model
{
    // 直接使用配置参数名
    protected $connection = 'db_config1';
}

Db::name或者Db::table方法的话都是单例的

db('user',[],false)->where('status',1)->select();

上面的方式会使用同一个数据库连接,第二个参数为数据库的连接参数,留空表示采用数据库配置文件的配置。

->select()

查询某个字段的值

where('id',1)->value('name')

查询某一列的值

where('status',1)->column('name','id')

数据集分批处理

Db::table('think_user')->chunk(100, function($users) {
    // 处理结果集...
 
foreach ($users as $user) {
        //
    }
    return false;
},'create_time', 'desc');

->insert($data)
$data = ['foo' => 'bar', 'bar' => 'foo'];
Db::table('think_user')->insert($data);

添加多条数据直接向 Db 类的 insertAll 方法传入需要添加的数据

$data = [
    ['foo' => 'bar', 'bar' => 'foo'],
    ['foo' => 'bar1', 'bar' => 'foo1'],
    ['foo' => 'bar2', 'bar' => 'foo2']
];
Db::name('user')->insertAll($data);

助手函数

// 添加单条数据
db('user')->insert($data);

// 添加多条数据
db('user')->insertAll($list);
Db::table('data')
    ->data(['name'=>'tp','score'=>1000])
    ->insert();

添加数据后如果需要返回新增数据的自增主键

Db::name('user')->insert($data);
$userId = Db::name('user')->getLastInsID();

或者直接使用insertGetId方法新增数据并返回主键值:

Db::name('user')->insertGetId($data);

// 根据主键删除
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();

助手函数

// 根据主键删除
db('user')->delete(1);
// 条件删除    
db('user')->where('id',1)->delete();

更新

->update(['name' => 'thinkphp','id'=>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);

如果需要延时更新则传入第三个参数,下例中延时10秒

Db::table('think_user')->where('id', 1)->setInc('score', 1, 10)

助手函数

// 更新数据表中的数据
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();

查询方法

where方法

可以使用where方法进行AND条件查询:

Db::table('think_user')
    ->where('name','like','%thinkphp')
    ->where('status',1)
    ->find();

多字段相同条件的AND查询可以简化为如下方式:

Db::table('think_user')
    ->where('name&title','like','%thinkphp')
    ->find();

whereOr方法

使用whereOr方法进行OR查询:

Db::table('think_user')
    ->where('name','like','%thinkphp')
    ->whereOr('title','like','%thinkphp')
    ->find();

多字段相同条件的OR查询可以简化为如下方式:

Db::table('think_user')
    ->where('name|title','like','%thinkphp')
    ->find();

getTableInfo方法

使用getTableInfo可以获取表信息,信息类型 包括 fields,type,bind,pk,以数组的形式展示,可以指定某个信息进行获取

// 获取`think_user`表所有信息
Db::getTableInfo('think_user');
// 获取`think_user`表所有字段
Db::getTableInfo('think_user', 'fields');
// 获取`think_user`表所有字段的类型
Db::getTableInfo('think_user', 'type');
// 获取`think_user`表的主键
Db::getTableInfo('think_user', 'pk');
where('字段名','表达式','查询条件');
whereOr('字段名','表达式','查询条件');

order方法

支持对多个字段的排序,例如:

Db::table('think_user')->where('status=1')->order('id desc,status')->limit(5)->select();

limit

用于文章分页查询是limit方法比较常用的场合,例如:

Db::table('think_article')->limit('10,25')->select();

表示查询文章数据,从第10行开始的25条数据

page

page方法还可以和limit方法配合使用,例如:

Db::table('think_article')->limit(25)->page(3)->select();

当page方法只有一个值传入的时候,表示第几页,而limit方法则用于设置每页显示的数量,也就是说上面的写法等同于:

Db::table('think_article')->page('3,25')->select(); 

field方法

在查询操作中field方法是使用最频繁的。

Db::table('think_user')->field('id,title,content')->select();

join

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();

a当前表的别名

UNION操作用于合并两个或多个 SELECT 语句的结果集。

使用示例:

Db::field('name')
      ->table('think_user_0')
      ->union('SELECT name FROM think_user_1')
      ->union('SELECT name FROM think_user_2')
      ->select();

DISTINCT 方法用于返回唯一不同的值 。

例如数据库表中有以下数据

以下代码会返回user_login字段不同的数据

Db::table('think_user')->distinct(true)->field('user_login')->select();

cache方法可以指定缓存标识:

Db::table('think_user')->cache('key',60)->find();

在外部就可以通过\think\Cache类直接获取查询缓存的数据,例如:

$result = Db::table('think_user')->cache('key',60)->find();
$data = \think\Cache::get('key');

缓存自动更新

这里的缓存自动更新是指一旦数据更新或者删除后会自动清理缓存(下次获取的时候会自动重新缓存)。

当你删除或者更新数据的时候,可以使用cache方法手动更新(清除)缓存,例如:

Db::table('think_user')->cache('user_data')->select([1,3,5]);
Db::table('think_user')->cache('user_data')->update(['id'=>1,'name'=>'thinkphp']);
Db::table('think_user')->cache('user_data')->select([1,5]);

最后查询的数据不会受第一条查询缓存的影响,确保查询和更新或者删除使用相同的缓存标识才能自动清除缓存。

如果使用find方法并且使用主键查询的情况,不需要指定缓存标识,会自动清理缓存,例如:

Db::table('think_user')->cache(true)->find(1);
Db::table('think_user')->update(['id'=>1,'name'=>'thinkphp']);
Db::table('think_user')->cache(true)->find(1);

其他

获取用户数:

Db::table('think_user')->count();
// 助手函数
db('user')->count();

或者根据字段统计:

Db::table('think_user')->count('id');
// 助手函数
db('user')->count('id');

获取用户的最大积分:

Db::table('think_user')->max('score');
// 助手函数
db('user')->max('score');

获取积分大于0的用户的最小积分:

Db::table('think_user')->where('score>0')->min('score');
// 助手函数
db('user')->where('score>0')->min('score');

获取用户的平均积分:

Db::table('think_user')->avg('score');
// 助手函数
db('user')->avg('score');

统计用户的总成绩:

Db::table('think_user')->sum('score');
// 助手函数
db('user')->sum('score');

时间

使用whereTime方法

whereTime方法提供了日期和时间字段的快捷查询,示例如下:

// 大于某个时间
Db::table('think_user')->whereTime('birthday', '>=', '1970-10-1')->select();
// 小于某个时间
Db::table('think_user')->whereTime('birthday', '<', '2000-10-1')->select();
// 时间区间查询
Db::table('think_user')->whereTime('birthday', 'between', ['1970-10-1', '2000-10-1'])->select();
// 不在某个时间区间
Db::table('think_user')->whereTime('birthday', 'not between', ['1970-10-1', '2000-10-1'])->select();

时间表达式

还提供了更方便的时间表达式查询,例如:

// 获取今天的博客
Db::table('think_blog') ->whereTime('create_time', 'today')->select();
// 获取昨天的博客
Db::table('think_blog')->whereTime('create_time', 'yesterday')->select();
// 获取本周的博客
Db::table('think_blog')->whereTime('create_time', 'week')->select();   
// 获取上周的博客
Db::table('think_blog')->whereTime('create_time', 'last week')->select();    
// 获取本月的博客
Db::table('think_blog')->whereTime('create_time', 'month')->select();   
// 获取上月的博客
Db::table('think_blog')->whereTime('create_time', 'last month')->select();      
// 获取今年的博客
Db::table('think_blog')->whereTime('create_time', 'year')->select();    
// 获取去年的博客
Db::table('think_blog')->whereTime('create_time', 'last year')->select();     

如果查询当天、本周、本月和今年的时间,还可以简化为:

// 获取今天的博客
Db::table('think_blog')->whereTime('create_time', 'd')->select();
// 获取本周的博客
Db::table('think_blog')->whereTime('create_time', 'w')->select();   
// 获取本月的博客
Db::table('think_blog')->whereTime('create_time', 'm')->select();   
// 获取今年的博客
Db::table('think_blog')->whereTime('create_time', 'y') ->select();    

V5.0.5+版本开始,还可以使用下面的方式进行时间查询

// 查询两个小时内的博客
Db::table('think_blog')->whereTime('create_time','-2 hours')->select();

猜你喜欢

转载自blog.csdn.net/qq_38738033/article/details/80311184