声明:本篇博客所使用的数据库及表还是上篇博客中的数据库和表(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);
因为在我们的编程过程中,一般都是几个库表相互关联的,我们在插入之后需要获取它的自增长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);
我刷新了两次,所以显示结果如下:
那么,当我们需要插入多条记录时,我们可以通过下边这个方法
//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);
二、 数据库更新操作
在更新记录之前,我先将原来的记录清空了,然后重新插入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);
如果我们仅想对表的某一个字段进行更新,我们就可以使用setField()方法
//setField() 仅对表中的某一个字段进行修改 返回结果也是受影响记录的行数
$res = $db -> where([
'id' => 22
]) -> setField('username', '3404767031');
dump($res);
它和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);
其实,如果你传递的where条件是表中的主键,那么你可以直接这样写
$db -> delete(id);
$db = Db::name('user');
$res = $db->delete(22);
dump($res);
当我们没有传递任何参数,也没有给where条件的时候,执行会报错,因为一般情况下我们是不会删除所有数据的,如果真的想删除所有,那么我们可以传递给where一个字符串”1=1”
$db = Db::name('user');
$res = $db->where("1=1")->delete();
dump($res);
四、 条件构造器
在前边说查询和删除的时候,使用db类,我们都需要传递where条件,那我们说一下where条件到底如何来编写:
之前我们传递的where条件,一直是一个数组,db类为我们提供了buildSql()方法,它会返回我们当前的SQL语句
$sql = $db->where([
'id' => 1
])->buildSql();
//当然我们也可以通过传递字符串的方式给where传递条件,例如:where("id = 1")
dump($sql);
如果我们在给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);
如果我们手写这个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);
如果大家还想了解更多关于链式操作的方法,可以参考官方手册进行了解
希望这些对小伙伴们有所帮助,互相学习,共同进步 ^_^