![](https://img-blog.csdnimg.cn/20210624144649254.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
ThinkPHP
ThinkPHP 是一个免费开源的,快速、简单的面向对象的 轻量级PHP开发框架 ,创立于2006年初,遵循Apache2开源协议发布,是为了敏捷WEB应用开发和简化企业应用开发而诞生的。ThinkPHP从诞生以来一直秉承简洁实用的设计原则,在保持出色的性能和至简的代码的同时,也注重易用性。并且拥有
上晴下雪
这个作者很懒,什么都没留下…
展开
-
四十三、ThinkPHP_6 路由的分组和MISS
一、路由分组路由分组:将相同前缀的路由合并分组,简化路由定义,提高匹配效率;使用 group() 方法,来进行分组路由的注册;Route::group('address',function(){ Route::rule(':id','Address/destails'); Route::rule(':name','Address/search');})->ext('html')->pattern(['id'=>'\d+','name'=>'\w+']);也可以省原创 2021-08-30 17:42:15 · 760 阅读 · 0 评论 -
四十二、ThinkPHP_6 路由的域名和跨域请求
通过域名路由闭包的形式,限制域名//二级域名开头部分限制,Route::domain('news',function(){ Route::rule('details/:id','Address/details');});//设置完整域名限制Route::domain('news',funciton(){ Route::rule('details/:id','Address/details');});//支持多个二级域名开头部分,使用相同的路由规则Route::domain(['new.原创 2021-08-27 16:52:08 · 506 阅读 · 0 评论 -
四十一、ThinkPHP_6 路由的地址和参数
一、路由地址路由的地址一般为:控制器/操作方法//默认Index 控制器Route::rule('/','index');//控制器/操作方法Route::rule(''details/:id','Address/details');支持多级控制器,支持路由到相应的地址//目录为:app\controller\groupnamespace app\controller\group//地址为 app\controller\grouphttp://localhost/group.b原创 2021-08-27 15:58:50 · 818 阅读 · 0 评论 -
四十、ThinkPHP_6 路由的变量规则和闭包
一、变量规则系统默认的变量规则为 \w+(正则),即字母、数字、中文和下刬线;更改默认匹配规则,可以修改 config/route.php 配置//默认的路由变量规则'default_route_pattern' => '[\w\.]+',pattern() : 进行单独的规则设置//全局变量Route::pattern([ 'id'=>'\d+', 'uid'=>'\d+']);//局部变量规则Route::rule('details/:id','Add原创 2021-08-27 15:41:08 · 946 阅读 · 0 评论 -
三十九、ThinkPHP_6 路由的定义
一、路由简介作用:让URL地址 更加规范和优雅,简洁。设置路由对 URL 的检测、验证等一系列操作提供了极大的便利性;路由默认是开启的,如果想要关闭路由,在 config/app.php 配置,定义文件在route/app.php//是否开启路由'with_route' => false,创建一个Address 控制器类 , 创建两个方法,具体如下class Address{ public function index() { return 'index'; }原创 2021-08-26 17:31:53 · 580 阅读 · 0 评论 -
三十八、ThinkPHP_6 多对多关联查询
user:用户表;role:角色表;access:中间表access 表包含了 user 和 role表 的关联 id,多对多模式//User 模型中,设置多对多关联//belongsToMany 为多对多关联,//belongsToMany('关联模型','中间表',['外键','关联键']);public function roles(){ return $this->belongsToMany(Role::class,Access::class);}Role.php 和.原创 2021-08-26 17:14:24 · 1765 阅读 · 0 评论 -
三十七、ThinkPHP_6 关联统计和输出
一、关联统计使用 withCount() 方法,统计主表关联附表的个数,输出 profile_count$list = UserModel::withCount(['profile'])->select([19,20,21]);foreach($list as $user){ echo $user->profile_count;//关联统计的输出采用“关联方法名”_count,这种结构输出}支持的统计方法 withMax(),withMin(),withSum(),withA原创 2021-08-26 16:01:39 · 919 阅读 · 0 评论 -
三十七、ThinkPHP_6 关联预载入
在普通的关联查询下,我们循环数据列表会执行 n+1 次 SQL查询//采用一对一的构建方式,打开trace 调试工具,会有四次查询$list = UserModel::select([19,20,21]);foreach($list as $user){ dump($user-profile);}关联预载入的方式,将会减少到两次,也就是起步一次,循环一次$list=UserModel::with(['profile'])->select([19,20,21]);foreach.原创 2021-08-21 17:23:25 · 442 阅读 · 0 评论 -
三十五、ThinkPHP_6 一对多关联查询
一、hasMany 模型hasMany 模式,适合主表关联附表,实现一对多查询//hasMany('关联模型',['外键','主键']);return $this->hasMany(Profile::class,'user_id','id');案例//关联查询$user = UserModel::find(19);return json($user->profile);//数据筛选查询$user->profile->where('id','>=10'原创 2021-08-21 14:45:07 · 2088 阅读 · 0 评论 -
三十四、ThinkPHP_6 一对一关联查询
一、 hasOne 模式hasOne 模型,适合主表关联附表//hasOne('关联模型',['外键','主键']);//关联模型(必须):关联的模型名或者类名//外键:默认的外键规则是当前模型名+_id//主键:当前模型主键,默认会自动获取也可以指定传入return $this->hasOne(Profile::class,'user_id','id');2.查询案例//user 模型 class User extends Model{ //方法名可以不与类名一致,建议一原创 2021-08-20 23:18:34 · 739 阅读 · 0 评论 -
三十三、ThinkPHP_6 关联模型初探
一、关联模型定义关联模型就是将表与表之间进行关联和对象化,更高效的操作数据。例如,我们已经有了test_user 表,主键为id,我们需要一个附表 test_profile,来进行关联,test_user 建立两个字段:user_id 和 hobby,外键是 user_id。创建 User 模型 和 Profile 模型,空模型//user 模型 class User extends Model{ //方法名可以不与类名一致,建议一致 public function profile()原创 2021-08-18 16:17:22 · 235 阅读 · 0 评论 -
三十二、ThinkPHP_6 模型和数据库的事件
一、数据库事件当执行增删除改查的时候,可以触发一些事件来执行额外的操作,这些操作可以部署在构造方法里等待激活执行数据库事件方法为Db::event(‘事件名’,‘执行方法’),具体事件名如下:befoere_selectselect 查询前回调before_findfind 查询前回调after_insertinsert 操作成功的回调after_updateupdate 操作成功后回调after_deletedelete 操作成功后回调原创 2021-08-18 16:07:00 · 494 阅读 · 0 评论 -
三十一、模型的软删除
一、模型软删除数据库没有太多软删除方法,推荐使用模型软删除需要在模型端设置软删除的功能。use SoftDelete;//开启软删除protected $deleteTime = 'delete_time';//这个是默认的UserModel::destroy(10);UserModel::find(10)->delete();//如果已经软删除了会报错UserModel::select();//软删除就不显示了当开启了软删除功能,withTrashed() 方法取消屏蔽软原创 2021-08-07 17:07:34 · 166 阅读 · 0 评论 -
三十、ThinkPHP6_JSON字段
一、数据库 JSON数据库写入,查询 JSON 字段,可以通过数组方式完成$data = [ 'name' => '张三', 'age' => 18 'list' => ['addrss'=>'在家',15],];//写入Db::name('user')->json['list']->insert($data);//查询Db::name('user')->json['list']->find(12);将 json 字段里的数据作为原创 2021-08-07 16:38:36 · 1219 阅读 · 0 评论 -
二十九、ThinkPHP6_模型的数据类型和转换
一、模型类型转换系统可以通过查勘型端设置写入或读取时对字段类型进行转换//模型端protected $type = [ 'price' => 'integer', 'status'=> 'boolean', 'create_time' => 'datetime:Y-m-d'];数据库查询读取的字段很多都是字符串,可以转换如下类型integer(整型)、float(浮点型)、boolean(布尔型)、array(数组)、object(对象)、serialize(序列原创 2021-08-05 19:59:34 · 766 阅读 · 0 评论 -
二十九、ThinkPHP6_模型自动获取和只读字段
一、模型自动时间戳全局开启方法,database.php,设置为true//自动写入时间戳'auto_timestamp' => true,单独模型开启//模型端中//开启自动时间戳protected $autoWriteTimestamp = true;自动时间戳开启后,会自动写入 create_time 和 update_time 两个字段自定义创建和修改时间戳protected $createTime = 'create_at';protected $upd原创 2021-08-05 19:54:18 · 419 阅读 · 0 评论 -
二十七、ThinkPHP6_模型的搜索器和数据集
一、模型搜索器搜索器是和用于封装字段(或搜索标识)查询表达式,类似查询范围 ;一个搜索器对应模型的一个特殊方法,该方法为 public,方法名的命名规范为:serarchFieldAttr()。比如:我们要封装一个邮箱字符模糊查询,然后封装一个时间限定查询//User 模型端,创建两个对外的方法//搜索器public function searchEmailAttr($query,$value,$data){ //$value 对应值 $data 对应数组 $query->wher原创 2021-08-05 19:41:19 · 474 阅读 · 0 评论 -
二十六、ThinkPHP6_模型的查询范围
一、模型查询范围在模型端创建一个封装的查询或写入方法,方便控制器调用。比如,封装一个筛选所有性别为男的查询,原创 2021-08-05 19:06:14 · 800 阅读 · 0 评论 -
二十五、ThinkPHP6_模型的获取器和修改器
一、模型获取器获取器的作用是对模型实例的数据做出自动处理。一个获取器对应模型一个特殊方法,该方法为 public,方法名的命名规范为:getFieldAttr();比如,数据库表示状态 status 字段采用的是数值,我们需要输出 status 字段希望是中文,就可以使用获取器,在User 模型端,创建一个对外的方法。//模型端public function getStatusAttr($value){ $status =[-1=>'禁用',1=>'正常',0=>'待审核']原创 2021-08-05 17:13:56 · 1219 阅读 · 0 评论 -
二十四、ThinkPHP6_数据库的字段设置
一、字段设置模型的数据字段和表字段是对应关系,默认会自支动获取,包括字段的类型。但是自动获取会导致增加一次查询,如果在模型中配置字段信息,会减少内存开销。可以在模型设置 $schema 字段,明确定义字段信息,字段需要对应表写完整。//设置字段信息,需要写完整的数据表字段protected $schema = [ 'id' => 'int', 'name' => 'string', 'status' => 'tyint',];系统提供了一条命令,生成一个字段信息原创 2021-08-05 16:25:31 · 941 阅读 · 0 评论 -
二十三、ThinkPHP6_模型的数据查询
一、数据查询find() 方法,通过主键(id)查询数据,如果不存在返回Null$user = UserModel::find(129);return json($user);where() 方法进行条件筛选查询数据$user = UserModel::where('name','李白')->find();findOrEmpty() 方法,数据不存在返回空模型,然后可以使用 isEmpty() 方法判断,是否为空模型$user = UserModel::findOrEmp原创 2021-08-05 15:59:24 · 1749 阅读 · 0 评论 -
二十二、ThinkPHP6_模型的数据更新
一、数据更新使用 find() 方法获取数据,然后通 save() 方法保存修改,返回布尔值$user = UserModel::find(11);$user->name='王一';$user->save()://或$user = UserModel::where('name','李小小')->find();$user->name='王一';$user->save():save() 方法只会更新变化的数据,如果提交的修改数据没有变化,则不更新,而for原创 2021-08-03 09:36:50 · 1324 阅读 · 0 评论 -
二十一、模型的新增和删除
一、数据新增/**方法1**///1.使用实例化的方式添加一条数据$user = new UserMdoel();//或 $user = new \app\model\User();//2.设置新增数据$user->name = '李白';$user->email= 'libai@163.com';//sava() 方法写入到数据库中,save() 返回布尔值$user->save();/**方法2**///通过 save() 传递数据数组的方式,来新增数据$user原创 2021-08-02 17:53:34 · 105 阅读 · 0 评论 -
二十、ThinkPHP6_模型的定义方式
一、定义模型定义一个和数据库表相匹配的模型class User extends Model模型会自动对应数据表,有一套自己的命名规则模型类型需要去除表前缀,采用驼峰式命名,并且首字母大写创建空模型后,我们可以在控制器调用,创建控制器 DataModel.php直接使用模型的名称 User:???? 调和查询方法,比如 select() 等如果没有代码提示,请和上一节一样,把5.1的注释复制过来class DataModal{ public function index() {原创 2021-08-02 17:19:20 · 594 阅读 · 0 评论 -
十九、ThinkPHP6_数据库的数据集和代码提示
一、代码提示代码提示是通过注释来告知编辑器自动补全方法对比一下 5.1 类库,发现 6.x类库没有写注释就拿Db类来说,只要把5.1的注释覆盖到6.x即可实现代码提示当然,是否精确,需要一一对比这些方法和参数,但绝大多数是相同找到Db类,看它的注释:@see 指向的是谁,是 DbManager 类然后将5.1 的 Db 类注释,复制给DbManager 类即可,以后其它的雷动操作二、数据集数据集就是查询后的结果集,它是 think\Collection 类型和数组一样虽然操作和数组类原创 2021-08-02 16:28:53 · 748 阅读 · 0 评论 -
ThinkPHP6的 flip 方法
项目场景:在ThinkPHP 版本6.0.9 中使用 flip方法,交换数据中的键和值问题描述://控制器$res=Db::table('user')->where('id',1)->find();$res->flip();//或$res=Db::table('user')->where('id',1)->select();$res->flip();会提示错误:Call to a member function flip() on array或 a原创 2021-08-02 14:59:23 · 385 阅读 · 0 评论 -
十六、数据库的高级查询
一、高级查询| (OR) , & (AND) 来实现 where 条件的高级查询, where 支持多个连缀Db::name('user') ->where('name','like','%小%') ->where([['price','>',40],['uid','>',10]]) ->select();有多个where ,且 where 条件是分离的 $map,而 $map 本身又是多个条件,那么 $map 条件如果需要先执行结果,再和后条件判断原创 2021-08-02 11:12:00 · 267 阅读 · 0 评论 -
十五、ThinkPHP6_链式查询方法
一、where表达式查询 where() 方法的基础查询方式Db::name('user')->where('id','<',10)->select();关联数组查询 键值对来数组键值对匹配的查询方式Db::name('user')->where([ 'gender' => '女', 'price' => 20 //'price' =>[20,30,32] //可以是数组])->select();索引数组查询,数组里的数组拼装方式原创 2021-08-02 10:36:07 · 681 阅读 · 0 评论 -
十四、 ThinkPHP6_聚合.原生.子查询
一、聚合查询使用 count() 方法,查询数据的数量//不传参Db::name('user')->count();//设置成指定字段,如果空值(Null),不会计算数量Db::name('user')->count('uid');max() 和 min() 方法,查询字段的最大/小值Db::name('user')->max('price');Db::name('user')->min('price');avg() 查询字段的平均值Db::nam原创 2021-07-29 11:34:36 · 1086 阅读 · 0 评论 -
十三、ThinkPHP6_数据库的时间查询
一、传统方式使用 >、<、>=、<= 筛选匹配时间的数据Db::name('user')->where('create_time','>','2021-1-24')-select();between 关键字来设置时间的区间Db::name('user')->where('create_time','between',['2021-1-1','2021-1-31'])->selelct();Db::name('user')->where原创 2021-07-28 15:38:51 · 1514 阅读 · 0 评论 -
十二、 ThinkPHP 数据库的查询表达式
一、比较查询查询表达式支持大部分常用 SQL 语句,//语法格式:where('字段名','查询表达式','查询条件')Db::name('user')->where('id',10)->find(); //等价于Db::name('user','=',10)->find();//使用 <>、>、<、>=、<= 筛选出各符合比较值的数据列表Db::name('user')->where('id','<>',80)-&g原创 2021-07-23 11:40:36 · 293 阅读 · 0 评论 -
十一、数据库的修改删除
一、数据修改使用 update() 方法来修改数据,修改成功返回影响行数,没有成功返回0$data = [ 'name' => '张三',];return Db::name('user')->where('id',2)->update($data);//修改成功,返回影响行数如果修改数据包含主键信息,比如 id,可以省略 where 条件$data = [ 'id' => 2, 'name' => '李四'];return Db::name('u原创 2021-07-22 17:53:03 · 115 阅读 · 0 评论 -
十七、数据库的快捷查询
一、快捷查询方法解析方法解析whereOr字段OR查询whereXor字段XOR 查询whereNull查询字段是否为NullwhereNotNull查询字段是否不为NullwhereIn字段IN查询whereNotIn字段NOT In 查询whereBetween字段BETWEEN 查询whereNotBetween字段 NOT BETWEENwhereLike字段LIKE查询whereNotLike字段 NOT LIKE查询原创 2021-07-22 16:25:45 · 267 阅读 · 0 评论 -
十八、数据库的事务和获取器
一、事务处理数据库的表引擎需要是 InnoDB 才可以使用。事务处理:需要执行多个SQL查询,数据关联是恒定的,如果成一条查询,改变了数据,而后一条失败,则前面的数据回滚,比如:小明给小红 3 块钱,小明 -3,小红 +3,为防后一条数据失败,就需要事务处理系统提供了两种事务处理方式://1.自动处理,出错自动回滚Db::transaction(function(){ Db::name('user')->where('id',10)->save(['price'=>Db::原创 2021-07-22 15:58:58 · 83 阅读 · 0 评论 -
十、数据库的数据新增
一、单数据新增使用 insert() 方法可以向数据表添加一条数据,更多的字段采用默认;如果新增成功,insert() 方法会返回一个 1 值;如果添加一个不存在的字段数据,会抛出一个异常 Exception,使用 strick(false) 方法,忽略异常。mysql 数据库支持 replace 写入,insert 存在主键相同则报错,replace 则修改;insertGetId() 方法,新建成功返回当前数据ID//案例1$data = [ 'name' => 'snow',原创 2021-07-02 22:39:34 · 1917 阅读 · 0 评论 -
九、数据库的链式操作
一、查询规则链式查询:->,当Db::name(‘user’) 返回的是查询对象(Query),即可连接数据库对应的方法;每次执行一个数据库查询方法时,比如 where() 还是返回查询对象(Query),只要还是数据库对象,那么就可以一直使用指向符号进行链式查询。再利用 find() 和 select() 是结果查询方法(放在最后),并不是链式查询方法;二、 更多查询如果多次使用数据库查询,那么每次静态创建都会生成一个实例,造成浪费;我们可以把对象实例保存下来,再进行反复调用即可;当原创 2021-07-02 21:59:09 · 620 阅读 · 0 评论 -
八、 数据库的数据查询
一、单条数据查询Db::table() 中 table 必须指定完整数据表find() 方法查询一条数据,需指定where 条件,//不指定 where 返回 nullDb::table('test_user')->find();//返回一条数据,没有就返回 nullDb::table('test_user')->where('id',1)->find();//返回一条数据,没有则抛出一个异常Db::table('test_user')->where('id'原创 2021-07-02 10:58:48 · 1285 阅读 · 0 评论 -
七、连接数据库与模型初探
一、连接数据库原理:TP 采用内置抽象层将不同的数据库操作进行封装处理,数据库像层基于PDO模式,无须针对不同的数据编写相应的代码;配置 config/database.php 文件。default 表示默认数据库连接3.案例namespace app\controller;use think\facade\Db;class DataTest{ $user = Db::table('tp_user')->select(); $user = Db::connect('mysq原创 2021-07-01 23:05:36 · 162 阅读 · 0 评论 -
六、基础,空,多级控制器
一、 基础控制器创建控制器后,一般继承基础控制器BaseController,提供了控制器验证功能,并注入 think\App 和 think\Request;namespace app\controller;use app\BaseController;class Test extends BaseController{ public function index() { //返回实际路径 return $this->app->getBasePath(); //原创 2021-07-01 22:51:58 · 118 阅读 · 0 评论 -
五、控制器定义
一、按制器定义控制器目录配置位置:config/route.php'controller_layer' => 'controller',类名和文件名大小写保持一至,并采用大驼峰避免同类名冲突配置位置:config/route.php'controller_suffix' => true,//为trueh时,按制器文件名必须以Controller 后缀,类名也要 Controller 后缀。二、渲染输出TP6 直接采用 return 输出,数组需要json:ret原创 2021-07-01 22:23:00 · 201 阅读 · 0 评论