《TP5.0学习笔记---对Mysql数据库的操作(二)》

时间:2022-10-17 00:19:45

声明:本篇博客所使用的数据库及表还是上篇博客中的数据库和表(http://blog.csdn.net/self_realian/article/details/78560456)

一、 数据库添加操作
在上一篇博客中,我们通过Db类中的query()和execute()方法,使用SQL语句的方式向数据库中添加的数据。下边我们学习一下它的其它插入方式:

$db = Db::name('user');
        //1,insert()方法,返回值是影响记录的行数,也就是插入数
        $res = $db->insert([
            'email'     => 'shulv_01@qq.com',
            'password'  => md5('shulv_01'),
            'username'  => 'shulv_01'
        ]);
        dump($res);

《TP5.0学习笔记---对Mysql数据库的操作(二)》
因为在我们的编程过程中,一般都是几个库表相互关联的,我们在插入之后需要获取它的自增长id,如果我们使用insert()方法,我们无法获取自增的id,我们可能需要更多的操作才能得到。那么,thinkphp的Db类为我们提供了insertGetId()方法

//insertGetId()返回自增id
$res = $db->insertGetId([
            'email'     => 'shulv_02@qq.com',
            'password'  => md5('shulv_02'),
            'username'  => 'shulv_02'
        ]);
        dump($res);

我刷新了两次,所以显示结果如下:
《TP5.0学习笔记---对Mysql数据库的操作(二)》
那么,当我们需要插入多条记录时,我们可以通过下边这个方法

//insertAll()返回的也是插入成功记录的条数
$db = Db::name('user');

        $data = [];
        for($i=0; $i<10; $i++){
            $data[] = [
                'email'    => "shulv_03_{$i}@qq.com",
                'password' => md5("shulv_03_{$i}"),
                'username' => "shulv_03_{$i}"
            ];
        }
        $res = $db->insertAll($data);
        dump($res);

《TP5.0学习笔记---对Mysql数据库的操作(二)》

二、 数据库更新操作
在更新记录之前,我先将原来的记录清空了,然后重新插入30条记录(还是使用insertAll()方法)

$db = Db::name('user');

       //update() 在使用这个函数的时候我们必须传递where条件,否则会报错。如果我们想更新全部,我们可以给where条件传递类似1=1的恒等条件
        $res = $db->where([
            'id'        => 21
        ])->update([
            'username'  => '3404767031'//下边还可以继续添加更新的字段
            //'email' => '3404767031@qq.com'
        ]);
        dump($res);

《TP5.0学习笔记---对Mysql数据库的操作(二)》
如果我们仅想对表的某一个字段进行更新,我们就可以使用setField()方法

//setField()   仅对表中的某一个字段进行修改  返回结果也是受影响记录的行数
        $res = $db -> where([
            'id'   => 22
        ]) -> setField('username', '3404767031');
        dump($res);

《TP5.0学习笔记---对Mysql数据库的操作(二)》
它和update()的区别就是,它每次只更新一个字段,而uodate()可以更新一个字段,也可以更新多个字段

为了说下边一个setInc()函数,我给表添加了一个num字段,类型为整形无符号

//setInc() 返回值仍然是受影响条数
        $res = $db -> where([
            'id'   => 21
        ]) -> setInc('num', 5);//如果我们只传递字段名,那么每刷新一次,该记录的该字段都会自增1。如果传递第二个参数,那么每次都会增加你传递的第二个参数
        dump($res);

下边还有一个setDec(),它与setInc()用法相同,效果相反,它是自减的。这里就不再举例了

三、 数据库删除操作
记录的删除,使用的是delete()方法

$db = Db::name('user');

        $res = $db->where([
            'id'   => 21
        ])->delete();
        dump($res);

《TP5.0学习笔记---对Mysql数据库的操作(二)》
其实,如果你传递的where条件是表中的主键,那么你可以直接这样写

$db -> delete(id);
$db = Db::name('user');

        $res = $db->delete(22);
        dump($res);

《TP5.0学习笔记---对Mysql数据库的操作(二)》
当我们没有传递任何参数,也没有给where条件的时候,执行会报错,因为一般情况下我们是不会删除所有数据的,如果真的想删除所有,那么我们可以传递给where一个字符串”1=1”

$db = Db::name('user');

        $res = $db->where("1=1")->delete();
        dump($res);

《TP5.0学习笔记---对Mysql数据库的操作(二)》
四、 条件构造器
在前边说查询和删除的时候,使用db类,我们都需要传递where条件,那我们说一下where条件到底如何来编写:
之前我们传递的where条件,一直是一个数组,db类为我们提供了buildSql()方法,它会返回我们当前的SQL语句

$sql = $db->where([
            'id' => 1
        ])->buildSql();
//当然我们也可以通过传递字符串的方式给where传递条件,例如:where("id = 1")
        dump($sql);

《TP5.0学习笔记---对Mysql数据库的操作(二)》
如果我们在给where传递参数的时候,不想以传递一个参数的这种方式时,使用传递两个参数的方式,我们可以将第一个参数传递为字段名,第二个为字段的值。 当我们想查询id不等于1的这条记录,那么我们就需要再添加一个参数,第一个参数还是字段名,第二个参数是表达式(<>:不等于 ),第三个参数为我们要判断的值

$db = Db::name('user');

        /* 这个条件表达式有哪些(不区分大小写): EQ: = NEQ: <> LT: < ELT: <= GT: > EGT: >= BETWEEN: BETWEEN * AND *: NOTBETWEEN: NOTBETWEEN * AND *: IN: IN (*,*): NOTIN: NOTIN (*,*): */
        $sql1 = $db->where("id", 1)->buildSql();
        $sql2 = $db->where("id", "NEQ", 1)->buildSql();//这里直接写<>也是可以的,其余几个也是这样,也可以直接写符号
        $sql3 = $db->where("id", "between", "1,5")->buildSql();//第三个参数也可以使用数组的方式,[1,5]
        $sql4 = $db->where("id", "in", "1,5,6,7,8")->buildSql();//同样,第三个参数也可以是数组

        //如果我们还想和以前一样通过数组的方式,那么我们可以这样写
        $sql5 = $db->where([
            'id'   => ['eq', 1]//其他的都可以这样写
        ])->buildSql();
        //如果,你想传递多个条件,即条件之间是AND的关系,那么可以接着写
        $sql6 = $db->where([
            'id'       => ['eq', 1],
            'username' => '3404767031@qq.com'
        ])->buildSql();

        //如果我们想通过上边那种字符串的方式传递多个条件时,可以写多个where
        $sql7 = $db
        ->where("id", "not in", [1,2,3,4])
        ->where("username", "eq", "3404767031")
        ->buildSql();
        //如果两个条件是"或"的关系,我们可以使用whereOr();
        $sql8 = $db
        ->where("id", "not in", [1,2,3,4])
        ->whereOr("username", "eq", "3404767031")
        ->buildSql();
        dump($sql1);
        dump($sql2);
        dump($sql3);
        dump($sql4);
        dump($sql5);
        dump($sql6);
        dump($sql7);
        dump($sql8);

《TP5.0学习笔记---对Mysql数据库的操作(二)》
如果我们手写这个SQL语句,将会消耗我们大量的精力,那么使用这种直接构造sql语句的方式,会节省我们大量的时间和精力
五、 链式操作
链式操作其实就是执行完db类的一个方法之后,返回的结果其实还是一个db类,这样,它就可以连续的调用多个方法。其实这个都是很好理解的

$db = Db::name('user');

        $res = $db
        ->where("id",">",60)
        ->field("username","id")//如果我们不想输出所有字段,我们可以通过该方法指定输出哪些字段
        ->order("id DESC")//倒序输出
        ->limit(3, 5)//限制输出的条数,表示从第三条开始返回,一共返回五条
        ->select();
        dump($res);

《TP5.0学习笔记---对Mysql数据库的操作(二)》
如果大家还想了解更多关于链式操作的方法,可以参考官方手册进行了解

希望这些对小伙伴们有所帮助,互相学习,共同进步 ^_^