Thinkphp6——数据库

Thinkphp6——数据库

  • ThinkPHP6 数据库和模型操作已经独立为ThinkORM库
  • 要使用Db类必须使用门面方式( think\facade\Db )调用
  • 数据库操作统一入口: Db::

我们可以在Navicat工具——查询中执行SQL命令,例如:

  • 创建数据库
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
DROP TABLE IF EXISTS `shop_cat`;
CREATE TABLE `shop_cat` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',
`name` varchar(50) NOT NULL COMMENT '分类名',
`status` tinyint(1) unsigned NOT NULL DEFAULT '1' COMMENT '状态 1开启 2关闭',
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=8 DEFAULT CHARSET=utf8mb4 COMMENT='分类表';

INSERT INTO `shop_cat` VALUES (1, '女装', 1);
INSERT INTO `shop_cat` VALUES (2, '男装', 1);
INSERT INTO `shop_cat` VALUES (3, '孕产', 1);
INSERT INTO `shop_cat` VALUES (4, '童装', 1);
INSERT INTO `shop_cat` VALUES (5, '电视', 1);
INSERT INTO `shop_cat` VALUES (6, '手机', 1);
INSERT INTO `shop_cat` VALUES (7, '电脑', 1);

执行原生sql语句

  1. query 方法用于执行 MySql 查询操作

    1
    2
    3
    4
    public function index(){
    $query = Db::query("SELECT * FROM `shop_goods` where status=1");
    print_r($query); // 返回值为二维数组
    }
  2. execute 方法用于执行 MySql 新增和修改操作

    1
    2
    3
    4
    5
    6
    public function index(){
    $execute = Db::execute("INSERT INTO `shop_goods` VALUES (3, 1, '2019秋冬连衣裙女', 1179.00, 0, 200, 1, 1576080000)"); // 使用insert into 插入
    print_r($execute);
    $execute = Db::execute("UPDATE `shop_goods` set `price`='1100' where `id`=3 "); // 使用update更新
    print_r($execute);
    }

tp自带数据库操作方法

查询

  1. 单条数据查询 find

    1
    2
    3
    4
    public function index(){
    $find = Db::table('shop_goods')->find(5);
    print_r($find); //find 方法查询结果不存在,返回 null,否则返回一维数组
    }

    注:我们一般只需关注查询操作的返回值类型

  2. 多条数据查询 select

    1
    2
    3
    4
    public function index(){
    $select = Db::table('shop_goods')->select();
    print_r($select); // 返回结果是object对象,可以转换为数组;
    }
  3. 获取单条记录(某行)某个字段的值 value

    1
    2
    3
    4
    public function index(){
    $value = Db::table('shop_goods')->where('id'==1007)value('title');
    print_r($value);
    }
  4. 查询某一列的值column

    1
    2
    3
    4
    5
    6
    public function index(){
    $column = Db::table('shop_goods')->column('title');
    print_r($column);
    $column = Db::table('shop_goods')->column('title','id');
    print_r($column);
    }

添加

  1. 添加一条数据 insert

    1
    2
    3
    4
    5
    public function index(){
    $data = ['cat'=>'1','title'=>'日系小浪漫连衣裙','price'=>'1598.35','add_time'=>1576080000];
    $insert = Db::table('shop_goods')->insert($data); //返回添加成功的条数,通常情况返回 1
    print_r($insert);
    }
  2. 添加一条数据insertGetId

    • insertGetId 返回添加数据的自增主键(一般为id值嘛)
    1
    2
    3
    4
    5
    public function index(){
    $data = ['cat'=>'1','title'=>'针织毛衣裙女','price'=>'690.00','add_time'=>1576080000];
    $insert = Db::table('shop_goods')->insertGetId($data);
    print_r($insert);
    }
  3. 添加多条数据 insertAll

    1
    2
    3
    4
    5
    6
    7
    8
    9
    public function index(){
    $data = [
    ['cat'=>'1','title'=>'内裤','price'=>'658.00','add_time'=>1576080000],
    ['cat'=>'1','title'=>'秋裤','price'=>'408.00','add_time'=>1576080000],
    ['cat'=>'2','title'=>' 小丁','price'=>'99.00','add_time'=>1576080000]
    ];
    $insert = Db::table('shop_goods')->insertAll($data);
    print_r($insert); // 返回添加成功的条数
    }

修改

  1. 修改数据 update

    1
    2
    3
    4
    5
    public function index(){
    $data = ['price'=>'68'];
    $update = Db::table('shop_goods')->where('id',8)->update($data);
    print_r($update); // 返回影响数据的条数
    }
  2. inc方法自增一个字段的值

    • 就是方便一点而已
    1
    2
    3
    4
    5
    6
    public function index(){
    $inc = Db::table('shop_goods')->where('id',5)->inc('stock')->update();
    print_r($inc);
    $inc = Db::table('shop_goods')->where('id',6)->inc('stock',5)->update();
    print_r($inc); // # 字段的值增加5
    }
    • dec 自减一个字段的值

删除

  1. 删除数据 delete

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    public function index(){
    # 根据条件删除数据
    $delete = Db::table('shop_goods')->where('id',1)->delete();
    print_r($delete);
    # 删除主键为2的数据
    $delete = Db::table('shop_goods')->delete(2); // 参数为主键值
    print_r($delete);
    # 删除整表数据
    $delete = Db::table('shop_goods')->delete(true);
    print_r($delete);
    }
  2. 软删除 useSoftDelete

    • 业务数据不建议真实删除数据,TP系统提供了软删除机制
    1
    2
    3
    4
    5
    public function index(){
    # 软删除
    $delete = Db::table('shop_goods')->useSoftDelete('status',3)->delete();
    print_r($delete);
    }

其他方法

  • save 方法统一写入数据,自动判断是新增还是更新数据

    1
    2
    3
    4
    5
    6
    7
    8
    9
    public function index(){
    # 添加数据
    $data = ['cat'=>'2','title'=>'美特斯邦威七分牛仔裤女2018夏季新款中腰修身洗水牛仔裤商场款','price'=>'49.90','add_time'=>1576080000];
    $save = Db::table('shop_goods')->save($data);
    print_r($save);
    # 修改数据
    $data = ['price'=>'99.00','id'=>3];
    $save = Db::table('shop_goods')->save($data);
    print_r($save);

Thinkphp提供了很多处理数据集的方法

  • 前面介绍了原生和tp6中的数据库CURD操作,对查询到的数据集也封装了很多方法处理,这些相当于工具,后面介绍工具使用的常用方法——链式操作
方法 描述
toArray 转换为数组
isEmpty 是否为空
all 所有数据
merge 合并其它数据
diff 比较数组,返回差集
flip 交换数据中的键和值
intersect 比较数组,返回交集
keys 返回数据中的所有键名
pop 删除数据中的最后一个元素
shift 删除数据中的第一个元素
unshift 在数据开头插入一个元素
push 在结尾插入一个元素
reduce 通过使用用户自定义函数,以字符串返回数组
reverse 数据倒序重排
chunk 数据分隔为多个数据块
each 给数据的每个元素执行回调
filter 用回调函数过滤数据中的元素
column 返回数据中的指定列
sort 对数据排序
order 指定字段排序
shuffle 将数据打乱
slice 截取数据中的一部分
map 用回调函数处理数组中的元素
where 根据字段条件过滤数组中的元素
whereLike Like查询过滤元素
whereNotLike Not Like过滤元素
whereIn IN查询过滤数组中的元素
whereNotIn Not IN查询过滤数组中的元素
whereBetween Between查询过滤数组中的元素
whereNotBetween Not Between查询过滤数组中的元素

注:看看就行,常用toArray()

数据库链式操作

  • 链式操作即增删改查配合新定义的方法在一条语句中完成对数据的多种操作

  • 数据库提供的链式操作方法,可以有效的提高数据存取的代码清晰度和开发效率

    连贯操作 作用 支持的参数类型
    where* 用于AND查询 字符串、数组和对象
    table 用于定义要操作的数据表名称 字符串和数组
    name 用于定义要操作的数据表名称 字符串
    field* 用于定义要查询的字段(支持字段排除) 字符串和数组
    order* 用于对结果排序 字符串和数组
    limit 用于限制查询结果数量 字符串和数字
    page 用于查询分页(内部会转换成limit) 字符串和数字

    注:带*标识的表示支持多次调用

  • 还有很多其他方法,下面将介绍主要方法

  • 链式操作一般配合表达式使用,表达式写在where里:

    表达式 含义 查询方法
    = 等于
    <> 不等于
    > 大于
    >= 大于等于
    < 小于
    <= 小于等于
    [NOT] LIKE 模糊查询 whereLike/whereNotLike
    [NOT] BETWEEN (不在)区间查询 whereBetween/whereNotBetween
    [NOT] IN (不在)IN 查询 whereIn/whereNotIn
    [NOT] NULL 查询字段是否(不)是NULL whereNull/whereNotNull

where查询

  • where方法在链式操作方法里面是最常用的方法,可以完成包括普通查询、表达式查询、快捷查询、区间查询、组合查询在内的条件查询操作

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    $select = Db::table('shop_goods')->where('id','=','1')->select();
    $select = Db::table('shop_goods')
    ->where('id','>','3')
    ->where('id','<','8')
    ->select();
    $select = Db::table('shop_goods')->where('title','like','%连衣裙%')->select(); // 模糊查询
    $select = Db::table('shop_goods')->where('title','not like','%连衣裙%')->select();

    $select = Db::table('shop_goods')->where('id','not between',[6,10])->select();

    $select = Db::table('shop_goods')->where('id','in','4,7,10')->select(); // [4,7,10]

field

  • 主要作用是设定要返回或者操作的字段,可以用于查询和写入操作

    1
    2
    3
    4
    $select = Db::table('shop_goods')
    ->field('title,price,discount as d')
    ->where('status',1)
    ->select();

order

  • 对操作的结果排序或者优先级限制

    1
    2
    3
    4
    5
    6
    $select = Db::table('shop_goods')
    ->field('title,price,id')
    ->where('status',1)
    ->order('price','DESC')
    ->order('id','DESC') // DESC 降序
    ->select();

limit

  • 主要用于指定查询和操作的数量

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    $select = Db::table('shop_goods')
    ->field('title,price,id')
    ->where('status',1)
    ->order('price','DESC') // 可以先使用order
    ->limit(0,5) // 从0开始,查询5条数据(不包括0)
    ->limit(4) // 从第4行开始查询后面所有行(不包括4)
    ->select(); // $offset $rowNums

    $select = Db::table('shop_goods')
    ->field('title,price,id')
    ->where('status',1)
    ->order('price','DESC')
    ->page(1,5) // page 方法主要用于分页查询
    ->select();

聚合查询

  • 使用聚合方法的查询

    方法 功能
    max 获取最大值,参数是要统计的字段名(必须)
    min 获取最小值,参数是要统计的字段名(必须)
    avg 获取平均值,参数是要统计的字段名(必须)
    sum 获取总数,参数是要统计的字段名(必须)
    count 统计数量,参数是要统计的字段名(可选)
    1
    2
    3
    4
    5
    6
    7
    // 获取最小值,参数是要统计的字段名(必须)
    $select = Db::table('shop_goods')->min('id');
    print_r($select);

    // 获取平均值,参数是要统计的字段名(必须)
    $select = Db::table('shop_goods')->avg('id');
    print_r($select);

注:在涉及到数据库操作的时候,往往需要结合php的一些原生方法,例如isset()

数据表 tablename

1
2
3
4
5
6
7
8
9
# 使用table必须完整数据库名
$select = Db::table('shop_goods')->where('id','10')->select();
print_r($select->toArray());
# 使用name数据库需要设置前缀,就可以不用写前缀
$select = Db::name('shop_goods')->where('id','11')->select();
print_r($select->toArray());
# 数据库设置前缀,无前缀访问
$select = Db::name('list')->where('id','12')->select();
print_r($select->toArray());
  • 前缀设置在database.php文件中
1
2
3
4
5
6
7
8
return [
'connections' => [
'mysql' => [
// 数据库表前缀
'prefix' => Env::get('database.prefix', 'shop_'),
]
]
];

加油

------ ���Ľ���------