zoukankan      html  css  js  c++  java
  • ThinkPHP 数据库操作(二) : 增删改查

    基本使用

    可以直接使用数据库运行原生SQL操作了,支持 query (查询操作)和 execute (写入操作)方法,并且支持参数绑定。

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

    可以使用多个数据库连接,使用

    Db::connect($config)->query('select * from think_user where id=:id',['id'=>8]);

    config是一个单独的数据库配置,支持数组和字符串,也可以是一个数据库连接的配置参数名。

    查询数据

    基本查询

    查询一个数据使用:

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

      find 方法查询结果不存在,返回 null

    查询数据集使用:

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

      select 方法查询结果不存在,返回空数组

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

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

      如果你的数据表没有使用表前缀功能,那么name和table方法的一样的效果。

    在 find 和 select 方法之前可以使用所有的链式操作方法。

      默认情况下,find和select方法返回的都是数组。

    助手函数

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

    db('user')->where('id',1)->find();
    db('user')->where('status',1)->select();

      注意:使用db助手函数默认每次都会重新连接数据库,而使用 Db::name 或者 Db::table 方法的话都 是单例的。db函数如果需要采用相同的链接,可以传入第三个参数,例如:

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

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

    使用Query对象或闭包查询

    或者使用查询对象进行查询,例如:

    $query = new 	hinkdbQuery();
    $query->table('think_user')->where('status',1);
    Db::find($query);
    Db::select($query);

    或者直接使用闭包函数查询,例如:

    Db::select(function($query){
      $query->table('think_user')->where('status',1);
    });

    值和列查询

    查询某个字段的值可以用

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

      value 方法查询结果不存在,返回 null

    查询某一列的值可以用

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

      column 方法查询结果不存在,返回空数组

    数据集分批处理

    如果你需要处理成千上百条数据库记录,可以考虑使用chunk方法,该方法一次获取结果集的一小块,然后填 充每一小块数据到要处理的闭包,该方法在编写处理大量数据库记录的时候非常有用。

    比如,我们可以全部用户表数据进行分批处理,每次处理 100 个用户记录:

    Db::table('think_user')->chunk(100, function($users) {
        foreach ($users as $user) {
            //查询数据
        }
    });
    // 或者交给回调方法myUserIterator处理
    Db::table('think_user')->chunk(100, 'myUserIterator');

    你可以通过从闭包函数中返回false来中止对数据集的处理:

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

    也支持在chunk方法之前调用其它的查询方法,例如:

    Db::table('think_user')->where('score','>',80)->chunk(100,function($users) {
        foreach ($users as $user) {
        //
        }
    });

    JSON类型数据查询(mysql V5.0.1 )

    // 查询JSON类型字段 (info字段为json类型)
    Db::table('think_user')->where('info$.email','thinkphp@qq.com')->find();

    添加数据

    添加一条数据

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

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

    如果你在 database.php 配置文件中配置了数据库前缀( prefix ),那么可以直接使用 Db 类的 name 方法提交数据

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

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

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

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

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

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

      insertGetId 方法添加数据成功返回添加数据的自增主键

    添加多条数据

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

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

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

    助手函数

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

    快捷更新

    V5.0.5+ 以上版本封装的快捷更新方法 data ,可以配合 insert 使用。

    下面举个例子说明用法:

    Db::table('data')
    ->data(['name'=>'tp','score'=>1000])
    ->insert();

    更新数据

    更新数据表中的数据

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

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

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

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

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

    Db::table('think_user')
    ->where('id', 1)
    ->update([
        'login_time' => ['exp','now()'],
        'login_times' => ['exp','login_times+1'],
    ]);

    更新某个字段的值

    Db::table('think_user')
        ->where('id',1)
        ->setField('name', 'thinkphp');

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

    自增或自减一个字段的值

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

    延迟更新

    setInc/setDec 支持延时更新,如果需要延时更新则传入第三个参数

    下例中延时10秒,给 score 字段增加1

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

      setInc/setDec 方法返回影响数据的条数

    助手函数

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

    快捷更新( V5.0.5+ )

    V5.0.5+ 以上版本封装的 data 、 inc 、 dec 和 exp 方法属于链式操作方法,可以配合 update 使 用。

    下面举个例子说明用法:

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

    删除数据

    删除数据表中的数据

    // 根据主键删除
    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();
  • 相关阅读:
    c++ mvc timer的应用
    table 在网页无法顶到头部问题
    vs2008 C++ 没有找到MSVCR90D.dll 问题
    FrametSet中各frame,iframe之间dom的访问
    关于VC中的Timer
    Vc2008中如何为视图类添加消息响应
    C++ map在MFC中的应用
    解决iframe 右边有空白的问题
    poj1125 Stockbroker Grapevine *
    poj1062 昂贵的聘礼 **
  • 原文地址:https://www.cnblogs.com/swjian/p/10618481.html
Copyright © 2011-2022 走看看