实战总结

原生查询

原生写法,就是手动写sql

  1. <!-- Db::query Db::execute -->
  2. #使用sql语句方式查询数据库
  3. $res = Db::query("select *from imooc_user";("select *from imooc_user where id=?",[1]);
  4. $res =Db::execute("insert into imooc_user set username=?,password?,email=?",['imooc',md5('imooc'),'imooc@qq.com']);

不用写sql的方法,主要是 4个查询方法。
21-thinkphp-数据库 - 图1

Db::table(‘tb_user’)->select(); Db::name(‘user’)->select();
db(‘user’)->select()
之间的区别??

Db::方法 因为是单例模式 不会重复实例化 而用db驻守函数会每次实例化,消耗内存,所以在后面加上false,这样db(‘表名’,[],false)就不会每次实例化了

insert /insertGetId/insertAll 插入

  1. <?php
  2. namespace app\index\controller;
  3. use think\controller;
  4. use think\Db;
  5. class Index
  6. {
  7. public function index(){
  8. $db = Db::name('user');
  9. #insert 返回值为插入影响行数
  10. // $res = $db->insert([
  11. // 'username' => 'wenco',
  12. // 'email' => 'wenco@qq.com',
  13. // 'password' => md5('today')
  14. // ]);
  15. #inset插入并且返回自增ID
  16. // $res = $db->insertGetId([
  17. // 'username' => 'wenco',
  18. // 'email' => 'wenco@qq.com',
  19. // 'password' => md5('today')
  20. // ]);
  21. #insetALL,返回插入成功数
  22. $data = [];
  23. for ($i = 1; $i < 10;$i++){
  24. $data[] = ['username' => "wenco_{$i}",
  25. 'email' => "wenco_{$i}@qq.com",
  26. 'password' => md5("today_{$i}")
  27. ];
  28. }
  29. $res = $db->insertAll($data);
  30. dump($res);
  31. }
  32. }

数据更新update/setField/setInc/setDec

  1. <?php
  2. namespace app\index\controller;
  3. use think\controller;
  4. use think\Db;
  5. class Index
  6. {
  7. public function index()
  8. {
  9. $db = Db::name('user');
  10. // #update返回影响行数
  11. // $res = $db->where(['id' => 1])->update(['username' => '1234567']);
  12. #setField,设置字段的值,返回被影响的数据的行数
  13. // $res = $db->where(['id'=>3])->setField([
  14. // 'username' => '88888888',
  15. // 'email' => '66666666'
  16. // ]);
  17. #setInc返回影响行数,第一个参数为字段名,第二个数据为在原数据的基础上的/*自增数*/
  18. $res = $db->where(['id'=>'1'])->setInc('num',5);
  19. #setDec同setInc,只不过第二个参数为/*自减数*/
  20. $res = $db->where(['id'=>'1'])->setDec('num',5);
  21. dump($res);
  22. }
  23. }

删除

  1. <?php
  2. namespace app\index\controller;
  3. use think\controller;
  4. use think\Db;
  5. class Index
  6. {
  7. public function index(){
  8. $db = Db::name('user');
  9. #delete返回影响行数,当在deleted()中的参数为主键时可不加where条件
  10. $res = $db->delete(2);
  11. dump($res);
  12. }
  13. }

where多种查询

感觉太灵活了,还不如写原生的。。。。

  1. <?php
  2. namespace app\index\controller;
  3. use think\controller;
  4. use think\Db;
  5. class Index
  6. {
  7. public function index(){
  8. $db = Db::name('user');
  9. #buildSql:返回sql语句
  10. #不区分大小写
  11. #EQ =
  12. #NEQ <>
  13. #LT <
  14. #ELT <=
  15. #GT >
  16. #EGT >=
  17. #BETWEEN BETWEEN * AND *
  18. #NOTBETWEEN NOTBETWEEN * AND *
  19. #IN IN (*,*)
  20. #NOTIN NOT IN(*,*)
  21. #连续使用where方法构成and where条件,
  22. // $sql = $db->where('id','BETWEEN' ,'1,5')->buildSql();
  23. $sql = $db
  24. ->where('id','exp' ,'not in(1,2,3)')
  25. ->where('username','eq', 'wenco_1')
  26. ->buildSql();
  27. #where与whereOr 构成or的关系
  28. $sql = $db
  29. ->where('id','exp' ,'not in(1,2,3)')
  30. ->whereOr('username','eq', 'wenco_1')
  31. ->buildSql();
  32. dump($sql);
  33. }
  34. }

主要是 一些 其他查询

  1. <?php
  2. namespace app\index\controller;
  3. use think\controller;
  4. use think\Db;
  5. class Index
  6. {
  7. public function index(){
  8. $db = Db::name('user');
  9. // $data = [];
  10. // for ($i=1; $i<21; $i++){
  11. // $data[] = [
  12. // 'username' => "wenco_{$i}",
  13. // 'password' => md5("wenco_{$i}"),
  14. // 'email' => "wenco_{$i}@qq.com",
  15. // 'num' => $i+100
  16. // ];
  17. // }
  18. // $res = $db->insertALL($data);
  19. $res =Db::table('imooc_user')
  20. ->field("username","id","group")
  21. ->order('id',DESC)
  22. ->limit(3,5)//limit分页limit((m-1)*n,n)=== m:当前页数,n:每页多少条数据
  23. ->page(2,5) //分页使用
  24. ->group("`group`") #因为 group 是关键字 所以加 ``
  25. ->select();
  26. dump($res);
  27. }
  28. }

用模型的方式来查询

查询数据

  1. <?php
  2. namespace app\index\controller;
  3. use think\Controller;
  4. use app\index\model\User;
  5. use think\Loader;
  6. class Index extends Controller{
  7. public function index(){
  8. #第一种
  9. $res = User::get(2);
  10. #第二种
  11. $user = new User;
  12. $res = $user::get(3);
  13. #第三种
  14. $user = Loader::model("User");
  15. #第四种
  16. $user = model("User");
  17. $res = $user::get(6);
  18. $res = $res->toArray();
  19. dump($res);
  20. }
  21. }

其他方法

  1. <?php
  2. namespace app\index\controller;
  3. use think\Controller;
  4. use app\index\controller\User;
  5. class index extends Controller{
  6. $res = User::get(function($query){
  7. $query->where("username","eq","zhangsan")
  8. ->filed("username,email");
  9. });
  10. $res = User::where("id",12)
  11. ->field("id,username")
  12. find();
  13. $res = User::all(function($query){
  14. $query->where("id","<","15")
  15. ->select();
  16. });
  17. $res = User::where('id','>',"15")
  18. ->field("username,email")
  19. ->limit(3)
  20. ->order('id DESC')
  21. ->select();
  22. foreach($res as $val){
  23. $res->toArray();
  24. dump($val->toArray());
  25. }
  26. $res = User::value('email');
  27. $res = User::where('id','10')->value('email');
  28. $res = User::column("email","username");
  29. dump($res);
  30. }

新增数据

  1. <?php
  2. namespace app\index\controller;
  3. use think\Controller;
  4. use app\index\model\User;
  5. class Index extends Controller{
  6. public function index(){
  7. #第一种插入
  8. $user = User::create([
  9. 'username'=>'zhangsan',
  10. 'password'=>md5(123456),
  11. 'age'=>13
  12. ],['username','age']);//第二个参数设置为true则只插入数据表中存在的字段,数组是允许插入的字段,不设置插入不存在的字段的时候会报错
  13. dump($res->id);//返回插入的ID
  14. #第二种插入
  15. $userModel = new User;
  16. $userModel->username = "lisi";
  17. $userModel->password = md5('sdfa');
  18. $userModel->save();
  19. dump($userModel->id);
  20. #第三种插入
  21. $userModel = new User;
  22. $res = $userModel
  23. ->allowField(['username'])
  24. ->save([
  25. "username"=>'wangba',
  26. 'password'=>md5('sdfs'),
  27. 'demo'=>123
  28. ]);
  29. #第四种插入 批量插入
  30. $res = $userModel->saveAll([
  31. ['age'=>17],
  32. ['age'=>18]
  33. ]);
  34. foreach($res as $val){
  35. $arr = $val->toArray();
  36. dump($arr);
  37. }
  38. }
  39. }

更新数据

  1. <?php
  2. namespace app\index\controller;
  3. use think\Controller;
  4. use app\index\model\User;
  5. class Index extends Controller
  6. {
  7. public function index(){
  8. #当数据中存在自增id时,数据更新方式,返回修改的内容,无法验证是否更改
  9. // $res = User::update([
  10. // 'id' => 1,
  11. // 'username' => 'wenco_update'
  12. // ]);
  13. // dump($res->toArray());
  14. #当数据中不存在自增id时如下,第二个参数即为where,可以为闭包函数,返回修改内容
  15. // $res = User::update([
  16. // 'username' => 'wenco_update'
  17. // 当第二个参数为数组 ],['id' => '2']);
  18. //当第二个参数为闭包函数 ],function ($query){
  19. // $query->where('id','>=', 15);
  20. // });
  21. #where 返回被影响行数,推荐使用!
  22. // $res = User::where('id','between',[1,5])->update([
  23. // 'username' => 'wenco_old'
  24. // ]);
  25. // dump($res);
  26. #User::get,返回被影响行数
  27. // $userModel = User::get(1);
  28. // $userModel->username = '123';
  29. // $userModel->email = '123@qq.com';
  30. // $res = $userModel->save();
  31. // dump($res);
  32. #new User,返回影响行数,第二个参数可以为闭包函数
  33. // $userModel = new User;
  34. // $res = $userModel->save([
  35. // 'username' => 555
  36. // ],['id' => 18]);
  37. // dump($res);
  38. #saveAll,返回结果集,不推荐使用
  39. $userModel = new User;
  40. $res = $userModel->saveAll([
  41. ['id' => 1,'username' => 'wencocococ' ],
  42. ['id' => 2,'username' => 'wencocococ' ]
  43. ]);
  44. dump($res);
  45. }
  46. }

删除数据

  1. <?php
  2. namespace app\index\controller;
  3. use think\Controller;
  4. use app\index\model\User;
  5. class Index extends Controller
  6. {
  7. public function index(){
  8. #destroy返回影响行数
  9. // $res = User::destroy(function ($query){
  10. // $query->where('id','<',5)
  11. // ->whereOr('id','>',10) ;
  12. // });
  13. // dump($res);
  14. #get返回影响行数
  15. // $userModel = User::get(7);
  16. // $res = $userModel->delete();
  17. // dump($res);
  18. #delete,返回影响行数
  19. $res = User::where('id',10)->delete();
  20. dump($res);
  21. }
  22. }

聚合函数

  1. <?php
  2. namespace app\index\controller;
  3. use think\Controller;
  4. use app\index\model\User;
  5. class Index extends Controller
  6. {
  7. public function index(){
  8. #count获取表中数据的条数
  9. // $res = User::count();
  10. #给count加where条件
  11. // $res = User::where('id','>',5)
  12. // ->where('id','<',10)
  13. // ->count();
  14. #max/min获取指定字段中数据的最大/小值
  15. // $res = User::max('id');
  16. #给max/min添加where条件
  17. // $res = User::where('id',"<",9)->count('id');
  18. #sum对指定字段数据求和
  19. // $res = User::sum('id');
  20. #对sum添加where条件
  21. // $res = User::where('id','<',8)->sum('id');
  22. #avg对指定字段数据求平均值
  23. // $res = User::avg('id');
  24. #对avg添加where条件
  25. $res = User::where('id','<',8)->avg('id');
  26. dump($res);
  27. }
  28. }

模型获取器

首先设置User模型:

  1. <?php
  2. namespace app\index\model;
  3. use think\Model;
  4. class User extends Model{
  5. #get+字段名+Attr
  6. public function getGenderAttr($val){
  7. switch ($val){
  8. case "1";
  9. return '男';
  10. break;
  11. case "2";
  12. return '女';
  13. break;
  14. default;
  15. return '未知';
  16. break;
  17. }
  18. }
  19. }

然后在index控制器中操作:

  1. <?php
  2. namespace app\index\controller;
  3. use think\Controller;
  4. use app\index\model\User;
  5. class Index extends Controller
  6. {
  7. public function index(){
  8. $res = User::get(1);
  9. dump($res->gender);//获取性别单栏数据
  10. dump($res->toArray());//以数组形式获取整条数据,性别显示为男/女/未知
  11. dump($res->getData());//以原始形式获取整条数据,性别显示为1/2/其他
  12. }
  13. }

模型修改器与自动完成

这个还是挺有用的,可以自定义 需要更新或者修改的字段。$auto $insert $update

  1. <?php
  2. namespace app\index\model;
  3. use think\Model;
  4. class User extends Model{
  5. #get+字段名+Attr
  6. public function getGenderAttr($val){
  7. switch ($val){
  8. case "1";
  9. return '男';
  10. break;
  11. case "2";
  12. return '女';
  13. break;
  14. default;
  15. return '未知';
  16. break;
  17. }
  18. }
  19. #模型修改
  20. // public function setPasswordAttr($val,$data){
  21. // return $val.$data['email'];
  22. // }
  23. #无论对数据库执行插入&更新操作,总是在数据中加上time字段相应的值
  24. protected $auto = [
  25. 'time'//字段名
  26. ];
  27. public function setTimeAttr(){
  28. return time();//字段对应的值
  29. }
  30. #insert/update对数据库执行插入/更新操作时,在数据字段中加入对应的值
  31. protected $insert = [
  32. 'insert'//字段名
  33. ];
  34. public function setInsertAttr(){
  35. return time();
  36. }
  37. }

模型时间戳

如果想在数据库表中字段create_time、update_time自动完成时间戳赋值,可在database.php中全局设置,auto_timestamp=>true即可

注意:默认是 create_time 和 update_time 字段

  1. <?php
  2. namespace app\index\model;
  3. use think\Model;
  4. class User extends Model{
  5. #autowritetimestamp表示创建与更新的时间戳都被打开
  6. protected $autoWriteTimestamp = true;
  7. // #createtime为false表示创建的时间戳被关闭
  8. // protected $createTime = false;
  9. // #updatetime为true表示更新时间戳被打开
  10. // protected $updateTime = true;
  11. // #创建数据的时候创建时间戳默认写入字段create_time中,当要自定义时:
  12. // protected $createTime = '自定义创建时间字段名';
  13. // #更新数据的时候更新时间戳默认写入字段update_time中,当要自定义时:
  14. // protected $updateTime = '自定义更新时间字段名';
  15. }

软删除

首先在模型里面引用SoftDelete

  1. <?php
  2. namespace app\index\model;
  3. use think\Model;
  4. use traits\model\SoftDelete;
  5. class User extends Model{
  6. use SoftDelete;
  7. #autowritetimestamp表示创建与更新的时间戳都被打开
  8. protected $autoWriteTimestamp = true;
  9. #删除数据的时候删除时间戳默认写入字段delete_time中,当要自定义时:
  10. // protected $deleteTime = '自定义删除时间字段名';
  11. }

然后在控制器里面执行操作

  1. <?php
  2. namespace app\index\controller;
  3. use think\Controller;
  4. use app\index\model\User;
  5. class Index extends Controller
  6. {
  7. public function index(){
  8. // $res = User::destroy(4);//被软删除
  9. // $res = User::get(2);//返回NULL
  10. #查询包含已删除的数据
  11. //$res = User::withTrashed(true)->find(2);
  12. #查询仅包含已删除的数据
  13. $res = User::onlyTrashed()->select();
  14. foreach ($res as $val){
  15. dump($val);
  16. }
  17. #若要恢复被软删除的数据,直接用update方式将delete_time的值设置为NULL即可
  18. #当开启软删除后要想真正彻底删除数据,在destroy的第二个参数后面传入一个true值
  19. $res = User::destroy(1,true);
  20. #通过get方式进行软删除/删除
  21. $res = User::get(3);//如果此处数据已经被软删除则获取到的为NULL,后面的操作无效
  22. $user->delete();//软删除
  23. $res = $user->delete(true);//删除
  24. }
  25. }

——————————————————————————-

原生

增删改查例子

  1. <?php
  2. namespace app\index\controller;
  3. use think\Controller;
  4. use think\Db as WuDb;
  5. class Db extends Controller {
  6. public function db() {
  7. # 读取配置文件中的配置
  8. #echo config('database.prefix'); //tp_
  9. /*$sql = "select * from tp_articles where id=?";
  10. $ret = WuDb::query($sql,[102]);
  11. dump($ret);*/
  12. # 如果一定要写原生sql,推荐写此关联数组占位
  13. /*$sql = "select * from tp_articles where id=:id";
  14. $ret = WuDb::query($sql, ['id' => 103]);
  15. dump($ret);*/
  16. // 添加
  17. /*$sql = "insert into tp_articles (title,desn,body) values (:title,:desn,:body)";
  18. $ret = WuDb::execute($sql, ['title' => '我是标题111', 'desn' => '我是描述','body'=>'aaaaaa']);
  19. dump($ret);*/
  20. // 修改
  21. /*$sql = "update tp_articles set title=:title where id=:id";
  22. $ret = WuDb::execute($sql,['title'=>'我是修改的','id'=>204]);
  23. dump($ret);*/
  24. // 删除
  25. $sql = "delete from tp_articles where id=:id";
  26. $ret = WuDb::execute($sql, ['id' => 204]);
  27. dump($ret);
  28. }
  29. }

连接数据库

在应用配置目录或者模块配置目录下面的config/database.php中配置下面的数据库参数
图片3.png
图片4.png

注:配置好的,一定要检查mysql服务是否开启,同时也要检查pdo是否打开。
同时还是创建好对应的数据库和连接数据库的用户名和密码并确保他们可以连接上你们的mysql服务器。

面向对象操作

常用的增删改查

  1. <?php
  2. namespace app\index\controller;
  3. use app\common\model\Articles;
  4. use think\Controller;
  5. use think\Db;
  6. use think\db\Query;
  7. use think\db\Where;
  8. use think\Request;
  9. class Wudi extends Controller {
  10. // 数据添加操作
  11. public function db() {
  12. /*//$data = ['title' => '我是标题111', 'desn' => '我是描述', 'body' => 'bbbb'];
  13. // 添加一条数据
  14. // 返回影响的行数
  15. // table写全表名称
  16. //$ret = Db::table('tp_articles')->insert($data);
  17. // name可以不写表前缀
  18. //$ret = Db::name('articles')->insert($data);
  19. // 推荐写方法 不需要表前缀
  20. //$ret = db('articles')->insert($data);
  21. //dump($ret);
  22. // 返回插入成功后的主键ID
  23. //$ret = db('articles')->insertGetId($data);
  24. //dump($ret);*/
  25. /*// 添加多条数据
  26. $data = [
  27. ['title' => '1111', 'desn' => '我是描述', 'body' => 'aaaa'],
  28. ['title' => '2222', 'desn' => '我是描述', 'body' => 'bbb'],
  29. ];
  30. // 返回受影响的行数
  31. $ret = db('articles')->insertAll($data);
  32. dump($ret);*/
  33. /*// 修改数据
  34. #$data = ['title' => '我是标题111', 'desn' => '我是描述', 'body' => 'bbbb'];
  35. //$ret = db('articles')->where('id','=',211)->update($data);
  36. #$ret = db('articles')->where('id',211)->update($data);
  37. #$data = ['id'=>210,'title' => '我是标题111', 'desn' => '我是描述', 'body' => 'bbbb'];
  38. #$ret = db('articles')->update($data);
  39. #dump($ret);
  40. // 5.1.7之后还支持了Db::raw写法
  41. $ret = db('articles')->where('id',210)->update([
  42. 'click' => Db::raw('click+1')
  43. ]);
  44. dump($ret);*/
  45. /*// 删除数据
  46. #$ret = db('articles')->delete(211);
  47. #$ret = db('articles')->delete([210,209]);
  48. #$ret = db('articles')->where('id',100)->delete();
  49. $ret = db('articles')->where('id',209)->useSoftDelete('delete_time',time())->delete();
  50. dump($ret);*/
  51. // 查询数据
  52. #$ret = db('articles')->find(209);
  53. #$ret = db('articles')->where('id',209)->find();
  54. // id大于100 click大于100
  55. #$ret = db('articles')->where('id','>',100)->where('click','>',100)->select();
  56. //select * from aaa where (id>10 and name like 'a%') or (level>100 and age>20)
  57. // 没有查询分组
  58. // $where = [
  59. // ['id', '>', 100],
  60. // ['click', '>', 100]
  61. // ];
  62. // $ret = db('articles')->where($where)->select();
  63. // $where = [
  64. // 'id' => ['>', 100],
  65. // 'click' => ['>', 100]
  66. // ];
  67. // $obj = new Where($where);
  68. // $ret = db('articles')->where($obj)->select();
  69. // 查询分组
  70. // $ret = db('articles')->where(function (Query $query){
  71. // $query->where('id','>',100)->where('click','>',100);
  72. // })->select();
  73. // $ret = db('articles')->where(function (Query $query){
  74. // $query->where('id','>',100)->where('click','>',100);
  75. // })->whereOr(function (Query $query){
  76. // $query->where('title','like','a%');
  77. // })->select();
  78. // 此用法一般用于 接口
  79. //$ret = db('articles')->where('id',985)->findOrFail();
  80. //$ret = db('articles')->where('id','>',500)->selectOrFail();
  81. // 排序和分页
  82. //$ret = db('articles')->order('id','desc')->limit(0,2)->select();
  83. // 获取指定的字段的值
  84. //$ret = db('articles')->where('id',210)->value('title');
  85. // 获取指定的列
  86. #$ret = db('articles')->column('title');
  87. #$ret = db('articles')->column('title','id');
  88. // 获取器 当前值 数据源
  89. $ret = db('articles')->withAttr('title',function ($value,$data){
  90. return '世界你好---'.$value;
  91. })->where('id','>',200)->select();
  92. dump($ret);
  93. }
  94. }

添加数据Db

  1. # 添加一条数据
  2. $data = ['foo' => 'bar', 'bar' => 'foo'];
  3. Db::name('user')->insert($data);
  4. Db::name('user')->data($data)->insert();
  5. db('user')->data($data)->insert();
  6. # 添加数据后如果需要返回新增数据的自增主键
  7. $userId = Db::name('user')->insertGetId($data);
  8. # 添加多条数据
  9. $data = [
  10. ['foo' => 'bar', 'bar' => 'foo'],
  11. ['foo' => 'bar1', 'bar' => 'foo1'],
  12. ['foo' => 'bar2', 'bar' => 'foo2']
  13. ];
  14. Db::name('user')->insertAll($data);
  15. db('user')->insertAll($data);
  16. Db::name('user')->data($data)->insertAll();

添加一条

图片1.png

添加多条

图片2.png

更新数据

更新数据一定要写条件

  1. db('user')->where('id', 1)->update(['name' => 'thinkphp']);
  2. db('user')->where('id', 1)->data(['name' => 'thinkphp'])->update();
  3. Db::name('user')->update(['name' => 'thinkphp','id'=>1]);
  4. # 5.1.7之后还支持了Db::raw写法
  5. Db::name('user')
  6. ->where('id', 1)
  7. ->update([
  8. 'name' => Db::raw('UPPER(name)'),
  9. 'score' => Db::raw('score-3'),
  10. 'read_time' => Db::raw('read_time+1')
  11. ]);

图片3.png

删除数据

  1. # 根据主键删除
  2. Db::table('think_user')->delete(1);
  3. Db::table('think_user')->delete([1,2,3]);
  4. # 条件删除
  5. Db::table('think_user')->where('id',1)->delete();
  6. Db::table('think_user')->where('id','<',10)->delete();
  7. # 无条件删除所有数据 小心去用
  8. Db::name('user')->delete(true);
  9. # 软删除数据 使用delete_time字段标记删除 逻辑删除
  10. # 软删除,必须要表中要delete_time字段
  11. Db::name('user')
  12. ->where('id', 1)
  13. ->useSoftDelete('delete_time',time())
  14. ->delete();

图片4.png

查询数据

  1. # 查询一条数据
  2. db('user')->find(主键ID);
  3. Db::name('user')->where('id',1)->find();
  4. # 如果希望在没有找到数据后抛出异常可以使用
  5. Db::name('user')->where('id',1)->findOrFail();
  6. # 查询多条记录
  7. Db::name('user')->where('status',1)->select();
  8. # 如果希望在没有找到数据后抛出异常可以使用
  9. Db::name('user')->where('status',1)->selectOrFail();
  10. # 查询某个字段的值可以用
  11. Db::name('user')->where('id',1)->value('name');
  12. # 查询某一列的值可以用
  13. Db::name('user')->where('id',1)->column('name');
  14. # 排序并获取指定记录条数
  15. Db::name('user')->order('id', 'desc')->limit(0,10)->select();
  16. # 聚合查询
  17. Db::name('user')->count();
  18. Db::name('user')->max('score');
  19. Db::name('user')->where('score', '>', 0)->min('score');
  20. Db::name('user')->avg('score');
  21. Db::name('user')->where('id',10)->sum('score');
  22. # 批量(字段)查询
  23. $map = [
  24. ['name', 'like', 'thinkphp%'],
  25. ['title', 'like', '%thinkphp'],
  26. ['id', '>', 0],
  27. ];
  28. Db::table('think_user')
  29. ->where([ $map ])
  30. ->where('status',1)
  31. ->select();
  32. SELECT * FROM `think_user` WHERE ( `name` LIKE 'thinkphp%' AND `title` LIKE '%thinkphp' AND `id` > 0 ) AND `status` = '1'
  33. # 闭包查询
  34. $name = 'thinkphp';
  35. $id = 10;
  36. Db::table('think_user')->where(function ($query) use($name, $id) {
  37. $query->where('name', $name)->whereOr('id', '>', $id);
  38. })->select();
  39. SELECT * FROM `think_user` WHERE ( `name` = 'thinkphp' OR `id` > 10 )
  40. # 获取器 5.1.20之后才有
  41. Db::name('user')->withAttr('name', function($value, $data) {
  42. return strtolower($value);
  43. })->select();
  44. 上面的代码,查询的数据集数据中的name字段的值会统一进行小写转换

图片5.png
图片6.png
图片7.png

模型操作

常用的增删改查

  1. <?php
  2. namespace app\index\controller;
  3. use app\common\model\Articles;
  4. use think\Controller;
  5. use think\Db;
  6. use think\db\Query;
  7. use think\db\Where;
  8. use think\Request;
  9. class Wudi extends Controller {
  10. public function md(){
  11. /*//$data = ['title' => '我是标题111', 'desn' => '我是描述', 'body' => 'bbbb'];
  12. // 添加一条数据
  13. // 返回影响的行数
  14. // table写全表名称
  15. //$ret = Db::table('tp_articles')->insert($data);
  16. // name可以不写表前缀
  17. //$ret = Db::name('articles')->insert($data);
  18. // 推荐写方法 不需要表前缀
  19. //$ret = db('articles')->insert($data);
  20. //dump($ret);
  21. // 返回插入成功后的主键ID
  22. //$ret = db('articles')->insertGetId($data);
  23. //dump($ret);*/
  24. /*// 添加多条数据
  25. $data = [
  26. ['title' => '1111', 'desn' => '我是描述', 'body' => 'aaaa'],
  27. ['title' => '2222', 'desn' => '我是描述', 'body' => 'bbb'],
  28. ];
  29. // 返回受影响的行数
  30. $ret = db('articles')->insertAll($data);
  31. dump($ret);*/
  32. /*// 修改数据
  33. #$data = ['title' => '我是标题111', 'desn' => '我是描述', 'body' => 'bbbb'];
  34. //$ret = db('articles')->where('id','=',211)->update($data);
  35. #$ret = db('articles')->where('id',211)->update($data);
  36. #$data = ['id'=>210,'title' => '我是标题111', 'desn' => '我是描述', 'body' => 'bbbb'];
  37. #$ret = db('articles')->update($data);
  38. #dump($ret);
  39. // 5.1.7之后还支持了Db::raw写法
  40. $ret = db('articles')->where('id',210)->update([
  41. 'click' => Db::raw('click+1')
  42. ]);
  43. dump($ret);*/
  44. /*// 删除数据
  45. #$ret = db('articles')->delete(211);
  46. #$ret = db('articles')->delete([210,209]);
  47. #$ret = db('articles')->where('id',100)->delete();
  48. $ret = db('articles')->where('id',209)->useSoftDelete('delete_time',time())->delete();
  49. dump($ret);*/
  50. /*// 查询数据
  51. #$ret = db('articles')->find(209);
  52. #$ret = db('articles')->where('id',209)->find();
  53. // id大于100 click大于100
  54. #$ret = db('articles')->where('id','>',100)->where('click','>',100)->select();
  55. //select * from aaa where (id>10 and name like 'a%') or (level>100 and age>20)
  56. // 没有查询分组
  57. // $where = [
  58. // ['id', '>', 100],
  59. // ['click', '>', 100]
  60. // ];
  61. // $ret = db('articles')->where($where)->select();
  62. // $where = [
  63. // 'id' => ['>', 100],
  64. // 'click' => ['>', 100]
  65. // ];
  66. // $obj = new Where($where);
  67. // $ret = db('articles')->where($obj)->select();
  68. // 查询分组
  69. // $ret = db('articles')->where(function (Query $query){
  70. // $query->where('id','>',100)->where('click','>',100);
  71. // })->select();
  72. // $ret = db('articles')->where(function (Query $query){
  73. // $query->where('id','>',100)->where('click','>',100);
  74. // })->whereOr(function (Query $query){
  75. // $query->where('title','like','a%');
  76. // })->select();
  77. // 此用法一般用于 接口
  78. //$ret = db('articles')->where('id',985)->findOrFail();
  79. //$ret = db('articles')->where('id','>',500)->selectOrFail();
  80. // 排序和分页
  81. //$ret = db('articles')->order('id','desc')->limit(0,2)->select();
  82. // 获取指定的字段的值
  83. //$ret = db('articles')->where('id',210)->value('title');
  84. // 获取指定的列
  85. #$ret = db('articles')->column('title');
  86. #$ret = db('articles')->column('title','id');
  87. // 获取器 当前值 数据源
  88. $ret = db('articles')->withAttr('title',function ($value,$data){
  89. return '世界你好---'.$value;
  90. })->where('id','>',200)->select();
  91. dump($ret);*/
  92. // 模型的查询 get直接查询,不可以带where条件,find两者都可以 推荐
  93. #$ret = Articles::get(102);
  94. #$ret = Articles::find(102);
  95. #$ret = Articles::where('id',102)->find();
  96. // 条件分组 where () or ()
  97. // $ret = Articles::where(function (Query $query){
  98. // #print_r(func_get_args());
  99. // $query->where('id','>',200);
  100. // })->whereOr(function (Query $query){
  101. // $query->where('click','>=',101);
  102. // })->select();
  103. // 查询title字段为"我是张三"的记录
  104. #$ret = Articles::where('title','我是张三')->select();
  105. // 动态查询 getBy固定 字段名,首字母大写,遇到下划线,下划线的后的首字母大写
  106. // 例: title_article getByTitleArticle
  107. #$ret = Articles::getByTitle('我是张三');
  108. // 读取器
  109. $ret = Articles::withAttr('title',function ($value,$data){
  110. return '我是添加的内容 --- '.$value;
  111. })->select();
  112. dump($ret);
  113. }
  114. public function add() {
  115. return view('index@wudi/add');
  116. }
  117. // 保存数据
  118. public function addsave(Request $request) {
  119. $data = $request->post();
  120. // 添加方案2
  121. /*$artModel = new Articles();
  122. $ret = $artModel->allowField(['title','body'])->save($data);*/
  123. // 添加数据
  124. #$ret = Articles::create($data);
  125. #dump($ret);
  126. }
  127. }

页面

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>表单数据提交</title>
  6. </head>
  7. <body>
  8. <form action="{:url('index/wudi/addsave')}" method="post">
  9. <p>
  10. <input type="text" name="title" id="">
  11. </p>
  12. <p>
  13. <input type="text" name="desn" id="">
  14. </p>
  15. <p>
  16. <input type="text" name="body" id="">
  17. </p>
  18. <p>
  19. <input type="text" name="sex" id="">
  20. </p>
  21. <p>
  22. <input type="submit" value="提交数据">
  23. </p>
  24. </form>
  25. </body>
  26. </html>

模型定义与模型设置

如果带模块名呢就在指定的模块名下面生成对应的model,如果不带模块名 ,就自动生成在,表示共享资源
image.png

  1. php think make:model 模块名/模型名(首字母大写)
  2. # 非必须
  3. protected $pk = 'uid'; # 设置主键名称
  4. protected $table = 'think_user'; #设置当前模型对应的完整数据表名称

图片8.png
图片9.png

添加数据

  1. # 添加一条数据
  2. # 方法1
  3. $user = new User;
  4. $user->name = 'thinkphp';
  5. $user->email = 'thinkphp@qq.com';
  6. $user->save();
  7. # 方法2
  8. $user = new User;
  9. $user->save([
  10. 'name' => 'thinkphp',
  11. 'email' => 'thinkphp@qq.com'
  12. ]);
  13. // 过滤post数组中的非数据表字段数据
  14. $user->allowField(true)->save($_POST);
  15. $user->allowField([要插入的字段,要插入的字段])->save($_POST);
  16. # 方法3
  17. $user = User::create([
  18. 'name' => 'thinkphp',
  19. 'email' => 'thinkphp@qq.com'
  20. ]);
  21. echo $user->name;
  22. # 添加多条记录
  23. $user = new User;
  24. $list = [
  25. ['name'=>'thinkphp','email'=>'thinkphp@qq.com'],
  26. ['name'=>'onethink','email'=>'onethink@qq.com']
  27. ];
  28. $user->saveAll($list);

图片10.png

更新数据

  1. # 方法1
  2. $user = User::get(1); find
  3. $user->name = 'thinkphp';
  4. $user->email = 'thinkphp@qq.com';
  5. $user->save();
  6. # 方法2
  7. $user = new User;
  8. // save方法第二个参数为更新条件
  9. $user->save([
  10. 'name' => 'thinkphp',
  11. 'email' => 'thinkphp@qq.com'
  12. ],['id' => 1]);
  13. $user = new User;
  14. // 过滤post数组中的非数据表字段数据
  15. $user->allowField(true)->save($_POST,['id' => 1]);
  16. # 方法3
  17. User::where('id', 1)->update(['name' => 'thinkphp']);

图片11.png

删除数据

  1. # 方法1
  2. $user = User::get(1);
  3. $user->delete();
  4. # 方法2
  5. User::destroy(1);
  6. User::destroy([1,2,3]);

图片12.png

软删除

在实际项目中,对数据频繁使用删除操作会导致性能问题,软删除的作用就是把数据加上删除标记,而不是真正的删除,同时也便于需要的时候进行数据的恢复。
图片13.png
图片14.png

图片15.png

图片16.png

查询数据

  1. # 查询单条记录
  2. $user = User::where('name', 'thinkphp')->find();
  3. # 查询多条记录
  4. $list = User::where('status', 1)->limit(3)->order('id', 'asc')->select();
  5. # 获取某个字段或者某个列的值
  6. // 获取某个用户的积分
  7. User::where('id',10)->value('score');
  8. // 获取某个列的所有值
  9. User::where('status',1)->column('name');
  10. # 动态查询
  11. // 根据name字段查询用户
  12. $user = User::getByName('thinkphp');

获取器

获取器的作用是对模型实例的(原始)数据做出自动处理

  1. <?php
  2. /**
  3. * 文章模型
  4. */
  5. namespace app\common\model;
  6. use think\Model;
  7. use think\model\concern\SoftDelete;
  8. class Articles extends Model
  9. {
  10. // 引入软删除的操作方法
  11. use SoftDelete;
  12. // 设置主键ID
  13. protected $pk = 'id';
  14. // 设置表名
  15. protected $table = 'tp_articles';
  16. // 删除的字段名
  17. protected $deleteTime = 'delete_time';
  18. // 获取器 get字段名Attr 如果有下划线,下划线的后首字母大写
  19. public function getCreateTimeAttr($value){
  20. return date('Y年m月d日 H时i分s秒',strtotime($value));
  21. }
  22. }

图片1.png

图片2.png

分页

超级简单!!!!
image.png

  1. // 列表页
  2. public function index(Request $request) {
  3. // 分页 页数 是否是简洁方式 相关配置
  4. #$data = Articles::paginate(10,false,['var_page'=>'p']);
  5. $data = Articles::paginate(3);
  6. // 查询对象中可用的方法
  7. #dump(get_class_methods($data));
  8. #echo $data->total();
  9. // 返回json数据
  10. // $arr = $data->toArray();
  11. // return json($arr);
  12. return view('index@article/index', compact('data'));
  13. }
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>文章列表</title>
  6. <link rel="stylesheet" href="/static/index/css/bootstrap.css" />
  7. <link rel="stylesheet" href="/static/index/css/bootstrap-theme.css" />
  8. </head>
  9. <body>
  10. <br>
  11. <div class="container">
  12. <table class="table table-hover">
  13. <thead>
  14. <tr>
  15. <th>ID</th>
  16. <th>标题</th>
  17. <th>操作</th>
  18. </tr>
  19. </thead>
  20. <tbody>
  21. {foreach $data as $item}
  22. <tr>
  23. <td>{$item.id}</td>
  24. <td>{$item.title}</td>
  25. <td>
  26. <div class="btn-group">
  27. <a href="button" class="btn btn-xs btn-primary">修改</a>
  28. <a href="button" class="btn btn-xs btn-danger">删除</a>
  29. </div>
  30. </td>
  31. </tr>
  32. {/foreach}
  33. </tbody>
  34. </table>
  35. <div>
  36. <!--推荐写法 分页组件-->
  37. {$data|raw}
  38. <!--不推荐-->
  39. {/*:html_entity_decode ($data->render())*/}
  40. </div>
  41. </div>
  42. <script src="/static/js/jquery.min.js"></script>
  43. <script src="/static/index/js/bootstrap.js"></script>
  44. </body>
  45. </html>