您现在的位置是:网站首页>>PHP>>thinkPHP

thinkPHP5.1数据库操作

发布时间:2018-08-23 15:47:52作者:wangjian浏览量:648点赞量:0

    一:配置文件

    在应用配置目录或者模块配置目录下面的database.php中(后面统称为数据库配置文件)配置下面的数据库参数:

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

    多数据库配置

    <?php
    return [
        // 数据库类型
        'type'        => 'mysql',
        // 服务器地址
        'hostname'    => '127.0.0.1',
        // 数据库名
        'database'    => 'blog',
        // 数据库用户名
        'username'    => 'root',
        // 数据库密码
        'password'    => 'huawei95chenai',
        // 数据库连接参数
        'params'      => [],
        // 数据库编码默认采用utf8
        'charset'     => 'utf8',
        'db_config1'      => [
            // 数据库类型
            'type'            => 'mysql',
            // 服务器地址
            'hostname'        => '127.0.0.1',
            // 用户名
            'username'        => 'root',
            // 密码
            'password'        => 'huawei95chenai',
            // 数据库名称
            'database'        => 'erp_mall',
            // 数据库编码默认采用utf8
            'charset'     => 'utf8',
        ],
    ];

    系统默认支持的数据库type包括:

    type数据库
    mysqlMySQL
    sqliteSqLite
    pgsqlPgSQL
    sqlsrvSqlServer


    配置参数参考

    参数名描述默认值
    type数据库类型
    hostname数据库地址127.0.0.1
    database数据库名称
    username数据库用户名
    password数据库密码
    hostport数据库端口号
    dsn数据库连接dsn信息
    params数据库连接参数
    charset数据库编码utf8
    prefix数据库的表前缀
    debug是否调试模式false
    deploy数据库部署方式:0 集中式(单一服务器),1 分布式(主从服务器)0
    rw_separate数据库读写是否分离 主从式有效false
    master_num读写分离后 主服务器数量1
    slave_no指定从服务器序号
    fields_strict是否严格检查字段是否存在true
    resultset_type数据集返回类型array
    auto_timestamp自动写入时间戳字段false
    sql_explain是否需要进行SQL性能分析 开启调试有效false
    query指定查询对象think\db\Query


    二:查询

    1:查询单个数据

    // table方法必须指定完整的数据表名
    Db::table('think_user')->where('id',1)->find();

    2:查询多个数据(数据集)

    Db::table('think_user')->where('status',1)->select();

    3:如果设置了数据表前缀参数的话,可以使用

    Db::name('user')->where('id',1)->find();
    Db::name('user')->where('status',1)->select();

    如果你的数据表没有设置表前缀的话,那么name和table方法效果一致。

    4:系统提供了一个db助手函数,可以更方便的查询

    db('user')->where('id',1)->find();
    db('user')->where('status',1)->select();
    db('user','db_config1')->where('id', 1)->find();  #如果需要使用不同的数据库连接,可以使用

    5:查询某个字段的值

    // 返回某个字段的值
    Db::table('think_user')->where('id',1)->value('name');

    6:查询某一列的值

    // 返回数组
    Db::table('think_user')->where('status',1)->column('name');
    // 指定id字段的值作为索引
    Db::table('think_user')->where('status',1)->column('name','id');

    7:如果要返回完整数据,并且添加一个索引值的话

    // 指定id字段的值作为索引 返回所有数据
    Db::table('think_user')->where('status',1)->column('*','id');

    8:大批量数据处理

    $cursor = Db::table('user')->where('status', 1)->cursor();
    foreach($cursor as $user){
    echo $user['name'];
    }

    cursor方法返回的是一个生成器对象,user变量是数据表的一条数据(数组)。

    表达式含义快捷查询方法
    =等于
    <>不等于
    >大于
    >=大于等于
    <小于
    <=小于等于
    LIKE模糊查询whereLike/whereNotLike
    [NOT] BETWEEN(不在)区间查询whereBetween/whereNotBetween
    [NOT] IN(不在)IN 查询whereIn/whereNotIn
    [NOT] NULL查询字段是否(不)是NULLwhereNull/whereNotNull
    [NOT] EXISTSEXISTS查询whereExists/whereNotExists
    [NOT] REGEXP正则(不)匹配查询(仅支持Mysql)
    [NOT] BETWEEM TIME时间区间比较whereBetweenTime
    > TIME大于某个时间whereTime
    < TIME小于某个时间whereTime
    >= TIME大于等于某个时间whereTime
    <= TIME小于等于某个时间whereTime
    EXP表达式查询,支持SQL语法whereExp

    9:连表查询:

    INNER JOIN: 等同于 JOIN(默认的JOIN类型),如果表中有至少一个匹配,则返回行

    LEFT JOIN: 即使右表中没有匹配,也从左表返回所有的行

    RIGHT JOIN: 即使左表中没有匹配,也从右表返回所有的行

    FULL JOIN: 只要其中一个表中存在匹配,就返回行

    说明

    join ( mixed join [, mixed $condition = null [, string $type = 'INNER']] )

    leftJoin ( mixed join [, mixed $condition = null ] )

    rightJoin ( mixed join [, mixed $condition = null ] )

    fullJoin ( mixed join [, mixed $condition = null ] )

    例:

    \db('user')
        ->alias('user')
        ->join('roles','roles.user_no = user.user_no')
        ->select();

    9:fetchSql方法表示不进行查询而只是返回构建的SQL语句,并且不仅仅支持select,而是支持所有的CURD查询。

    $subQuery = Db::table('think_user')
        ->field('id,name')
        ->where('id', '>', 10)
        ->fetchSql(true)
        ->select();

    生成的subQuery结果为:

    SELECT `id`,`name` FROM `think_user` WHERE `id` > 10

    10:子查询:

    Db::table($subQuery . ' a')
        ->where('a.name', 'like', 'thinkphp')
        ->order('id', 'desc')
        ->select();

    生成的SQL语句为:

    SELECT * FROM ( SELECT `id`,`name` FROM `think_user` WHERE `id` > 10 ) a WHERE a.name LIKE 'thinkphp' ORDER BY `id` desc
    Db::table('think_user')
        ->where('id', 'IN', function ($query) {
            $query->table('think_profile')->where('status', 1)->field('id');
        })
        ->select();

    生成的SQL语句是

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

    生成的SQL语句为

    SELECT * FROM `think_user` WHERE EXISTS ( SELECT * FROM `think_profile` WHERE `status` = 1 )

    11:排序

    Db::table('skill_article')->order('id','desc')->select();//按照id倒叙排序

    12:分页查询

    $page = 2;#查询页数
    $limit = ($page-1) * 10;
    Db::table('skill_article')->order('id','asc')->limit($limit,10)->select();

    三:添加数据:

    1:添加一条数据

    使用 Db 类的 insert 方法向数据库提交数据

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

    insert 方法添加数据成功返回添加成功的条数,通常情况返回 1

    或者使用data方法配合insert使用。

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

    添加数据后如果需要返回新增数据的自增主键,可以使用insertGetId方法新增数据并返回主键值:

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

    2:添加多条数据

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

    insertAll 方法添加数据成功返回添加成功的条数

    也可以使用data方法

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

    如果批量插入的数据比较多,可以指定分批插入,使用limit方法指定每次插入的数量限制。

    $data = [
        ['foo' => 'bar', 'bar' => 'foo'],
        ['foo' => 'bar1', 'bar' => 'foo1'],
        ['foo' => 'bar2', 'bar' => 'foo2']
        ...
    ];
    // 分批写入 每次最多100条数据
    Db::name('user')->data($data)->limit(100)->insertAll();

    四:更新数据

    Db::name('user')
        ->where('id', 1)
        ->update(['name' => 'thinkphp']);

    实际生成的SQL语句是:

    UPDATE `think_user`  SET `name`='thinkphp'  WHERE  `id` = 1

    update 方法返回影响数据的条数,没修改任何数据返回 0

    支持使用data方法传入要更新的数据

    Db::name('user')
        ->where('id', 1)
        ->data(['name' => 'thinkphp'])
        ->update();

    如果update方法和data方法同时传入更新数据,则会进行合并。

    如果数据中包含主键,可以直接使用:

    Db::name('user')
        ->update(['name' => 'thinkphp','id'=>1]);

    实际生成的SQL语句和前面用法是一样的:

    UPDATE `think_user`  SET `name`='thinkphp'  WHERE  `id` = 1

    如果要更新的数据需要使用SQL函数或者其它字段,可以使用下面的方式:

    Db::name('user')
        ->where('id',1)
        ->inc('read_time')
        ->dec('score',3)
        ->exp('name','UPPER(name)')
        ->update();

    实际生成的SQL语句:

    UPDATE `think_user`  SET `read_time` = `read_time` + 1 , `score` = `score` - 3 , `name` = UPPER(name)  WHERE  `id` = 1

    使用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);

    最终生成的SQL语句是:

    UPDATE `think_user`  SET `score` = `score` + 1  WHERE  `id` = 1 
    UPDATE `think_user`  SET `score` = `score` + 5  WHERE  `id` = 1
    UPDATE `think_user`  SET `score` = `score` - 1  WHERE  `id` = 1
    UPDATE `think_user`  SET `score` = `score` - 5  WHERE  `id` = 1

    setInc/setDec支持延时更新,如果需要延时更新则传入第三个参数,下例中延时10秒更新。

    Db::name('user')->where('id', 1)->setInc('score', 1, 10);

    setInc/setDec 方法返回影响数据的条数,如果使用了延迟更新的话,可能会返回true

    五:删除数据

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

    最终生成的SQL语句是:

    DELETE FROM `think_user` WHERE  `id` = 1 
    DELETE FROM `think_user` WHERE  `id` IN (1,2,3) 
    DELETE FROM `think_user` WHERE  `id` = 1 
    DELETE FROM `think_user` WHERE  `id` < 10

    delete 方法返回影响数据的条数,没有删除返回 0

    // 无条件删除所有数据
    Db::name('user')->delete(true);

    五:事务操作

    // 启动事务
    Db::startTrans();
    try {
        Db::table('think_user')->find(1);
        Db::table('think_user')->delete(1);
        // 提交事务
        Db::commit();
    } catch (\Exception $e) {
        // 回滚事务
        Db::rollback();
    }

    学习连接:https://www.kancloud.cn/manual/thinkphp5_1/353999

0 +1