• thinkphp5.0学习笔记(四)数据库的操作


    ThinkPHP内置了抽象数据库访问层,把不同的数据库操作封装起来,我们只需要使用公共的Db类进行操作,而无需针对不同的数据库写不同的代码和底层实现,Db类会自动调用相应的数据库驱动来处理。采用PDO方式,目前包含了Mysql、SqlServer、PgSQL、Sqlite等数据库的支持。

    1.基本使用

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

    public function read()
    {
        $sql = Db::query('select * from news');
        dump($sql);   
        
    }

    输出的是:

    execute方法:

    public function read()
    {
        $sql = Db::execute('insert into news (nid, rid) values (11, 11)');;
        dump($sql);
    }

    输出:

    数据库添加成功!

    也支持命名占位符绑定,例如:

    public function read()
    {
        $sql = Db::query('select * from news where nid=:nid',['nid'=>1]);
        dump($sql);
    }

    输出:

    execute方法:

    public function read()
    {
        $sql = Db::execute('insert into news (nid, rid) values (:nid, :rid)',['nid'=>18,'rid'=>'121']);
        dump($sql);
    }

    输出:

    数据库添加成功!

     

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

    2.查询构造器

    听名字就知道,很装X..

    先来看基本查询

    查询一个数据:

     // table方法必须指定完整的数据表名
        $sql =Db::table('news')->where('nid',1)->find();
        dump($sql);

    find = 查询一条;并且查询结果不存在,返回 null

    输出:

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

    这条查询语句与上面同效,但是select 方法查询结果不存在,返回空数组

    额 这个玩意叫查询数据集,没错!

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

     

    如果你要查询某个字段的值,咋整?

    public function read()
    {
    // 返回某个字段的值
        $sql =Db::table('news')->where('nid',18)->value('rid');
        dump($sql);
    }

    这样看输出,我求rid的值:

     

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

    public function read()
    {
        $sql =Db::table('news')->chunk(1,function($user){
            foreach($user as $u)
            {
    dump($u);
            }
        });
        
    
    }

    这个样子  就可以一条一条都给遍历出来了!

    是“一条一条·”,嘿!

     

    3.添加数据跟删除数据

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

    public function read()
    {
    $data = ['ntitle' => '123', 'rid' => '456'];
    $sql = Db::table('news')->insert($data);
        
    dump($sql);
    }

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

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

    public function read()
    {
    $data = ['ntitle' => '123', 'rid' => '345'];
    $sql = Db::table('news')->insert($data);
    $userId = Db::name('news')->getLastInsID('nid');
    dump($userId);
    dump($sql);
    }

    看输出:

    主键字段22!

     

     添加多条数据:

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

    public function read()
    {
    $data = [
    ['ntitle' =>'gaga','rid' => '12'],
    ['ntitle' =>'gaaaga','rid' => '123']
    ];
    $sql = Db::table('news')->insertAll($data);
    
    dump($sql);
    }

    这样的话,返回的应该是两条2

    删除数据:

    根据主键来删除

    public function read()
    {
    //    根据主键 来删
    $sql = Db::table('news')->delete(1);
    //多删
    //$sql = Db::table('news')->delete(1,2,3);
    dump($sql);
    }

    执行成功返回影响行数;

    还有一种是根据条件来删除

    public function read()
    {
    //    根据条件 来删
    $sql = Db::table('news')->where('nid',18)->delete();
    //多删
    //$sql = Db::table('news')->where('nid','<',1)->delete();
    dump($sql);
    }

    执行成功也是返回影响行数;

    4.查询方法:

    where方法:

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

    public function read()
    {
    $sql = Db::table('news')
    ->where('nid',20)
    ->where('ntitle',123)
    ->find();
    dump($sql);
    }

    whereOr方法:

    使用whereOr方法进行OR查询:

    public function read()
    {
    $sql = Db::table('news')
    ->where('nid',20)
    ->whereOr('ntitle','like','%123%')
    ->find();
    dump($sql);
    }

    混合查询:

    where方法和whereOr方法在复杂的查询条件中经常需要配合一起混合使用

    public function read()
    {
    $sql = Db::table('news')
    ->where(function($query){
        $query->where('nid',21)->where('nid',22);
    })
    ->whereOr(function($query)
    {
        $query->where('ntitle','123')->whereOr('ntitle','123');
    })
    ->select();
    dump($sql);
    }

    输出的是:

    看一下生成的代码:

    SELECT * FROM `news` WHERE  (  `nid` = 1 OR `nid` = 2 ) OR (  `ntitle` LIKE '123' OR `ntitle` LIKE '123' )

    第一个查询方法用where或者whereOr是没有区别的。

     

     

     

  • 相关阅读:
    二维数组中的查找
    浅析Java的Object类
    Alan Turing的纪录片观后感
    近期学习docker遇到的一些问题
    eclipse(STS)安装jd-eclipse插件实现查看API源代码功能
    deepin配置Oracle JDK
    两个有序链表的合并
    Maven 项目中各包单独打成jar包
    一次性密码 && 身份认证三要素
    HTTPS工作流程
  • 原文地址:https://www.cnblogs.com/xuan584521/p/7060761.html
Copyright © 2020-2023  润新知