...
ThinkPHPv6.0
123zyy 著
序言

<div id="s-1516840388"><blockquote class="danger"><p>手册阅读须知:本手册仅针对ThinkPHP<code>6.*</code>版本。</p></blockquote><h2><a id="_2"></a...

基础

<div id="s-1516840388"><p><a href="1037481">安装</a><br/><a href="1037482">开发规范</a><br/><a href="1037483">目录结构</a><br/><a href="10...

安装

<div id="s-1516840388"><p>ThinkPHP<code>6.0</code>的环境要求如下:</p><blockquote class="info"><ul><li>PHP &gt;= 7.2.5</li></ul></blockq...

开发规范

<div id="s-1516840388"><h2><a id="_0"></a>命名规范</h2><blockquote class="danger"><p>请理解并尽量遵循以下命名规范,可以减少在开发过程中出现不必要的错误。</p></blockqu...

目录结构

<div id="s-1516840388"><blockquote class="info"><p>相对于<code>5.1</code>来说,<code>6.0</code>版本目录结构的主要变化是核心框架纳入<code>vendor</code>目录...

配置

<div id="s-1516840388"><h2><a id="_0"></a>配置目录</h2><h3><a id="_2"></a>单应用模式</h3><p>对于单应用模式来说,配置文件和目录很简单,根目录下的<code>config</code>...

架构

<div id="s-1516840388"><p><a href="1075414">请求流程</a><br/><a href="1037486">架构总览</a><br/><a href="1037487">入口文件</a><br/><a href="...

请求流程

<div id="s-1516840388"><h2><a id="HTTP_0"></a>HTTP请求流程</h2><p>对于一个HTTP应用来说,从用户发起请求到响应输出结束,大致的标准请求流程如下:</p><ul><li>载入<code>Compos...

架构总览

<div id="s-1516840388"><p><code>ThinkPHP</code>支持传统的<code>MVC</code>(Model-View-Controller)模式以及流行的<code>MVVM</code>(Model-View-V...

入口文件

<div id="s-1516840388"><p>ThinkPHP<code>6.0</code>采用<strong>单一入口模式</strong>进行项目部署和访问,一个应用都有一个统一(但不一定是唯一)的入口。如果采用自动多应用部署的话,一个入口文件...

多应用模式

<div id="s-1516840388"><h2><a id="_0"></a>多应用</h2><p>安装后默认使用<strong>单应用模式部署</strong>,目录结构如下:</p><div class="ಠcopy-code-container...

URL访问

<div id="s-1516840388"><h2><a id="URL_0"></a>URL设计</h2><p><code>6.0</code>的URL访问受路由影响,如果在没有定义或匹配路由的情况下(并且没有开启强制路由模式的话),则是基于:</p>...

容器和依赖注入

<div id="s-1516840388"><h2><a id="_0"></a>容器和依赖注入</h2><p>ThinkPHP使用容器来更方便的管理类依赖及运行依赖注入,新版的容器支持<code>PSR-11</code>规范。</p><blockqu...

服务

<div id="s-643262271"><h2><a id="_0"></a>系统服务</h2><p>系统服务的概念是指在执行框架的某些组件或者功能的时候需要依赖的一些基础服务,服务类通常可以继承系统的<code>think\Service</code...

门面

<div id="s-643262271"><h2><a id="Facade_0"></a>门面(<code>Facade</code>)</h2><p>门面为容器中的(动态)类提供了一个静态调用接口,相比于传统的静态方法调用, 带来了更好的可测试性和扩...

中间件

<div id="s-643262271"><p>中间件主要用于拦截或过滤应用的<code>HTTP</code>请求,并进行必要的业务处理。</p><blockquote class="danger"><p>新版部分核心功能使用中间件处理,你可以灵活关闭...

事件

<div id="s-643262271"><p>新版的事件系统可以看成是<code>5.1</code>版本行为系统的升级版,事件系统相比行为系统强大的地方在于事件本身可以是一个类,并且可以更好的支持事件订阅者。</p><p>事件相比较中间件的优势是事件...

路由

<div id="s-643262271"><p>路由是应用开发中比较关键的一个环节,其主要作用包括但不限于:</p><ul><li>让URL更规范以及优雅;</li><li>隐式传入额外请求参数;</li><li>统一拦截并进行权限检查等操作;</li>...

路由定义

<div id="s-643262271"><p>要使用<code>Route</code>类注册路由必须首先在路由定义文件开头添加引用(后面不再重复说明)</p><div class="ಠcopy-code-container"><pre><code c...

变量规则

<div id="s-643262271"><h2><a id="_0"></a>变量规则</h2><blockquote class="danger"><p>系统默认的变量规则设置是<code>\w+</code>,只会匹配字母、数字、中文和下划线字符,...

路由地址

<div id="s-643262271"><h2><a id="_0"></a>路由地址</h2><p>路由地址表示定义的路由表达式最终需要路由到的实际地址(或者响应对象)以及一些需要的额外参数,支持下面几种方式定义:</p><h2><a id="_4"...

路由参数

<div id="s-643262271"><h2><a id="_0"></a>路由参数</h2><p>路由分组及规则定义支持指定路由参数,这些参数主要完成路由匹配检测以及后续行为。</p><blockquote class="danger"><p>路由...

路由中间件

<div id="s-643262271"><h2><a id="_0"></a>路由中间件</h2><p>可以使用路由中间件,注册方式如下:</p><div class="ಠcopy-code-container"><pre><code class="ಠ...

路由分组

<div id="s-643262271"><h2><a id="_0"></a>路由分组</h2><p>路由分组功能允许把相同前缀的路由定义合并分组,这样可以简化路由定义,并且提高路由匹配的效率,不必每次都去遍历完整的路由规则(尤其是开启了路由延迟解析后...

资源路由

<div id="s-643262271"><h2><a id="_0"></a>资源路由</h2><p>支持设置<code>RESTFul</code>请求的资源路由,方式如下:</p><div class="ಠcopy-code-container">...

注解路由

<div id="s-643262271"><h2><a id="_0"></a>注解路由</h2><p>ThinkPHP支持使用注解方式定义路由(也称为注解路由),如果需要使用注解路由需要安装额外的扩展:</p><div class="ಠcopy-cod...

路由绑定

<div id="s-643262271"><p>可以使用路由绑定简化URL或者路由规则的定义,绑定支持如下方式:</p><h2><a id="_2"></a>绑定到控制器/操作</h2><p>把当前的URL绑定到控制器/操作,最多支持绑定到操作级别,例如...

域名路由

<div id="s-643262271"><h2><a id="_0"></a>域名路由</h2><p>ThinkPHP支持完整域名、子域名和IP部署的路由和绑定功能,同时还可以起到简化URL的作用。</p><p>可以单独给域名设置路由规则,例如给<co...

MISS路由

<div id="s-643262271"><h2><a id="MISS_0"></a>全局MISS路由</h2><p>如果希望在没有匹配到所有的路由规则后执行一条设定的路由,可以注册一个单独的<code>MISS</code>路由:</p><div c...

跨域请求

<div id="s-643262271"><h2><a id="_0"></a>跨域请求</h2><p>如果某个路由或者分组需要支持跨域请求,可以使用</p><div class="ಠcopy-code-container"><pre><code cla...

URL生成

<div id="s-643262271"><p>ThinkPHP支持路由URL地址的统一生成,并且支持所有的路由方式,以及完美解决了路由地址的反转解析,无需再为路由定义和变化而改变URL生成。</p><blockquote class="danger">...

控制器

<div id="s-643262271"><p>按照ThinkPHP的架构设计,所有的URL请求(无论是否采用了路由),最终都会定位到控制器(也许实际的类不一定是控制器类,但也属于广义范畴的控制器)。控制器的层可能有很多,为了便于区分就把通过URL访问的...

控制器定义

<div id="s-643262271"><h2><a id="_0"></a>控制器定义</h2><p>控制器文件通常放在<code>controller</code>下面,类名和文件名保持大小写一致,并采用驼峰命名(首字母大写)。</p><p>如果要...

基础控制器

<div id="s-643262271"><p>大多数情况下,我们建议给你的控制器继承一个基础控制器。</p><p>默认安装后,系统提供了一个<code>app\BaseController</code>基础控制器类,你可以对该基础控制器进行修改。</p...

空控制器

<div id="s-643262271"><h2><a id="_0"></a>空控制器</h2><p>空控制器的概念是指当系统找不到指定的控制器名称的时候,系统会尝试定位当前应用下的空控制器(<code>Error</code>)类,利用这个机制我们可...

资源控制器

<div id="s-643262271"><h2><a id="_0"></a>资源控制器</h2><p>资源控制器可以让你轻松的创建<code>RESTFul</code>资源控制器,可以通过命令行生成需要的资源控制器,例如生成index应用的Blog...

控制器中间件

<div id="s-643262271"><h2><a id="_0"></a>控制器中间件</h2><p>支持为控制器定义中间件,你只需要在你的控制器中定义<code>middleware</code>属性,例如:</p><div class="ಠco...

请求

<div id="s-643262271"><p><a href="1037517">请求对象</a><br/><a href="1037518">请求信息</a><br/><a href="1037519">输入变量</a><br/><a href="1...

请求对象

<div id="s-643262271"><p>当前的请求对象由<code>think\Request</code>类负责,该类不需要单独实例化调用,通常使用依赖注入即可。在其它场合则可以使用<code>think\facade\Request</cod...

请求信息

<div id="s-643262271"><h2><a id="_0"></a>请求信息</h2><p><code>Request</code>对象支持获取当前的请求信息,包括:</p><table><thead><tr><th>方法</th><th>含...

输入变量

<div id="s-643262271"><p>可以通过<code>Request</code>对象完成全局输入变量的检测、获取和安全过滤,支持包括<code>$_GET</code>、<code>$_POST</code>、<code>$_REQUES...

请求类型

<div id="s-643262271"><h2><a id="_0"></a>获取请求类型</h2><p>在很多情况下面,我们需要判断当前操作的请求类型是<code>GET</code>、<code>POST</code>、<code>PUT</cod...

HTTP头信息

<div id="s-643262271"><p>可以使用<code>Request</code>对象的<code>header</code>方法获取当前请求的<code>HTTP</code>请求头信息,例如:</p><div class="ಠcopy-...

伪静态

<div id="s-643262271"><p>URL伪静态通常是为了满足更好的SEO效果,ThinkPHP支持伪静态URL设置,可以通过设置<code>url_html_suffix</code>参数随意在URL的最后增加你想要的静态后缀,而不会影响当...

参数绑定

<div id="s-643262271"><h2><a id="_0"></a>参数绑定</h2><p>参数绑定是把当前请求的变量作为操作方法(也包括架构方法)的参数直接传入,参数绑定并不区分请求类型。</p><blockquote class="dan...

请求缓存

<div id="s-643262271"><h2><a id="_0"></a>请求缓存</h2><p>支持请求缓存功能,支持对GET请求设置缓存访问,并设置有效期。</p><blockquote class="danger"><p>请求缓存仅对GET请...

响应

<div id="s-643262271"><h2><a id="_0"></a>响应</h2><blockquote class="info"><p>响应(<code>Response</code>)对象用于动态响应客户端请求,控制发送给用户的信息。通常...

响应输出

<div id="s-643262271"><h2><a id="_0"></a>响应输出</h2><p>大多数情况,我们不需要关注<code>Response</code>对象本身,只需要在控制器的操作方法中返回数据即可。</p><p>最简单的响应输出是...

响应参数

<div id="s-643262271"><p><code>Response</code>对象提供了一系列方法用于设置响应参数,包括设置输出内容、状态码及<code>header</code>信息等,并且支持链式调用以及多次调用。</p><h2><a i...

重定向

<div id="s-643262271"><h2><a id="_0"></a>重定向</h2><p>可以使用<code>redirect</code>助手函数进行重定向</p><div class="ಠcopy-code-container"><pre...

文件下载

<div id="s-643262271"><h2><a id="_0"></a>文件下载</h2><p>支持文件下载功能,可以更简单的读取文件进行下载操作,支持直接下载输出内容。</p><p>你可以在控制器的操作方法中添加如下代码:</p><div cl...

数据库

<div id="s-643262271"><blockquote class="danger"><p>新版的数据库和模型操作已经独立为<a href="https://github.com/top-think/think-orm" target="_bl...

连接数据库

<div id="s-643262271"><p>如果应用需要使用数据库,必须配置数据库连接信息,数据库的配置文件有多种定义方式。</p><h2><a id="_2"></a>配置文件</h2><p>在全局或者应用配置目录(不清楚配置目录位置的话参考配置章...

分布式数据库

<div id="s-643262271"><h2><a id="_0"></a>分布式支持</h2><p>数据访问层支持分布式数据库,包括读写分离,要启用分布式数据库,需要开启数据库配置文件中的<code>deploy</code>参数:</p><div...

查询构造器

<div id="s-643262271"><p><a href="1037533">查询数据</a><br/><a href="1037534">添加数据</a><br/><a href="1037535">更新数据</a><br/><a href="1...

查询数据

<div id="s-643262271"><h2><a id="_0"></a>查询单个数据</h2><p>查询单个数据使用<code>find</code>方法:</p><div class="ಠcopy-code-container"><pre><c...

添加数据

<div id="s-643262271"><h2><a id="_0"></a>添加一条数据</h2><p>可以使用<code>save</code>方法统一写入数据,自动判断是新增还是更新数据(以写入数据中是否存在主键数据为依据)。</p><div c...

更新数据

<div id="s-643262271"><h2><a id="_0"></a>更新数据</h2><p>可以使用save方法更新数据</p><div class="ಠcopy-code-container"><pre><code class="ಠhigh...

删除数据

<div id="s-643262271"><h2><a id="_0"></a>删除数据</h2><div class="ಠcopy-code-container"><pre><code class="ಠhighlight-container"><spa...

查询表达式

<div id="s-643262271"><h2><a id="_0"></a>查询表达式</h2><p>查询表达式支持大部分的SQL查询语法,也是<code>ThinkPHP</code>查询语言的精髓,查询表达式的使用格式:</p><div clas...

链式操作

<div id="s-643262271"><p>数据库提供的链式操作方法,可以有效的提高数据存取的代码清晰度和开发效率,并且支持所有的CURD操作(原生查询不支持链式操作)。</p><p>使用也比较简单,假如我们现在要查询一个User表的满足状态为1的前...

where

<div id="s-643262271"><p><code>where</code>方法的用法是ThinkPHP查询语言的精髓,也是ThinkPHP <code>ORM</code>的重要组成部分和亮点所在,可以完成包括普通查询、表达式查询、快捷查询、区...

table

<div id="s-643262271"><p><code>table</code>方法主要用于指定操作的数据表。</p><h2><a id="_2"></a>用法</h2><p>一般情况下,操作模型的时候系统能够自动识别当前对应的数据表,所以,使用<c...

alias

<div id="s-643262271"><p><code>alias</code>用于设置当前数据表的别名,便于使用其他的连贯操作例如join方法等。</p><p>示例:</p><div class="ಠcopy-code-container"><pr...

field

<div id="s-643262271"><p><code>field</code>方法主要作用是标识要返回或者操作的字段,可以用于查询和写入操作。</p><h2><a id="_2"></a>用于查询</h2><h3><a id="_4"></a>指定...

strict

<div id="s-643262271"><p><code>strict</code>方法用于设置是否严格检查字段名,用法如下:</p><div class="ಠcopy-code-container"><pre><code class="ಠhighli...

limit

<div id="s-643262271"><p><code>limit</code>方法主要用于指定查询和操作的数量。</p><blockquote class="danger"><p><code>limit</code>方法可以兼容所有的数据库驱动类的...

page

<div id="s-643262271"><p>page方法主要用于分页查询。</p><p>我们在前面已经了解了关于<code>limit</code>方法用于分页查询的情况,而<code>page</code>方法则是更人性化的进行分页查询的方法,例如...

order

<div id="s-643262271"><p><code>order</code>方法用于对操作的结果排序或者优先级限制。</p><p>用法如下:</p><div class="ಠcopy-code-container"><pre><code clas...

group

<div id="s-643262271"><p><code>GROUP</code>方法通常用于结合合计函数,根据一个或多个列对结果集进行分组 。</p><p><code>group</code>方法只有一个参数,并且只能使用字符串。</p><p>例如,...

having

<div id="s-643262271"><p><code>HAVING</code>方法用于配合group方法完成从分组的结果中筛选(通常是聚合条件)数据。</p><p><code>having</code>方法只有一个参数,并且只能使用字符串,例如:...

join

<div id="s-643262271"><p><code>JOIN</code>方法用于根据两个或多个表中的列之间的关系,从这些表中查询数据。join通常有下面几种类型,不同类型的join操作会影响返回的数据结果。</p><ul><li><strong...

union

<div id="s-643262271"><p>UNION操作用于合并两个或多个 SELECT 语句的结果集。</p><p>使用示例:</p><div class="ಠcopy-code-container"><pre><code class="ಠhig...

distinct

<div id="s-643262271"><p>DISTINCT 方法用于返回唯一不同的值 。</p><p>例如数据库表中有以下数据</p><p><img alt="" src="https://box.kancloud.cn/40a5052a92030...

lock

<div id="s-643262271"><p><code>Lock</code>方法是用于数据库的锁机制,如果在查询或者执行操作的时候使用:</p><div class="ಠcopy-code-container"><pre><code class="...

cache

<div id="s-643262271"><p><code>cache</code>方法用于查询缓存操作,也是连贯操作方法之一。</p><p><strong>cache</strong>可以用于<code>select</code>、<code>find...

cacheAlways

<div id="s-643262271"><p><code>cacheAlways</code>的使用方法与<code>cache</code>一样,只不过在最终表现中,如果本次查询数据为空,那么<code>cache</code>不会缓存,而<code...

comment

<div id="s-643262271"><p>COMMENT方法 用于在生成的SQL语句中添加注释内容,例如:</p><div class="ಠcopy-code-container"><pre><code class="ಠhighlight-cont...

fetchSql

<div id="s-643262271"><p><code>fetchSql</code>用于直接返回SQL而不是执行查询,适用于任何的CURD操作方法。 例如:</p><div class="ಠcopy-code-container"><pre><co...

force

<div id="s-643262271"><p>force 方法用于数据集的强制索引操作,例如:</p><div class="ಠcopy-code-container"><pre><code class="ಠhighlight-container">D...

partition

<div id="s-643262271"><p><code>partition</code> 方法用于<code>MySQL</code>数据库的分区查询,用法如下:</p><div class="ಠcopy-code-container"><pre><...

failException

<div id="s-643262271"><p><code>failException</code>设置查询数据为空时是否需要抛出异常,用于<code>select</code>和<code>find</code>方法,例如:</p><div class...

sequence

<div id="s-643262271"><p><code>sequence</code>方法用于<code>pgsql</code>数据库指定自增序列名,其它数据库不必使用,用法为:</p><div class="ಠcopy-code-containe...

replace

<div id="s-643262271"><p><code>replace</code>方法用于设置<code>MySQL</code>数据库<code>insert</code>方法或者<code>insertAll</code>方法写入数据的时候是否...

extra

<div id="s-643262271"><p><code>extra</code>方法可以用于<code>CURD</code>查询,例如:</p><div class="ಠcopy-code-container"><pre><code class="...

duplicate

<div id="s-643262271"><p>用于设置<code>DUPLICATE</code>查询,用法示例:</p><div class="ಠcopy-code-container"><pre><code class="ಠhighlight-co...

procedure

<div id="s-643262271"><p><code>procedure</code>方法用于设置当前查询是否为存储过程查询,用法如下:</p><div class="ಠcopy-code-container"><pre><code class="...

聚合查询

<div id="s-643262271"><p>在应用中我们经常会用到一些统计数据,例如当前所有(或者满足某些条件)的用户数、所有用户的最大积分、用户的平均成绩等等,ThinkPHP为这些统计操作提供了一系列的内置方法,包括:</p><table><th...

分页查询

<div id="s-643262271"><h2><a id="_0"></a>分页实现</h2><p><code>ThinkPHP</code>内置了分页实现,要给数据添加分页输出功能变得非常简单,可以直接在<code>Db</code>类查询的时候调...

时间查询

<div id="s-643262271"><h2><a id="_0"></a>时间比较</h2><blockquote class="info"><p>框架内置了常用的时间查询方法,并且可以自动识别时间字段的类型,所以无论采用什么类型的时间字段,都可以...

高级查询

<div id="s-643262271"><h2><a id="_0"></a>快捷查询</h2><p>快捷查询方式是<strong>一种多字段相同查询条件</strong>的简化写法,可以进一步简化查询条件的写法,在多个字段之间用<code>|</co...

视图查询

<div id="s-643262271"><p>视图查询可以实现不依赖数据库视图的多表查询,并不需要数据库支持视图,是JOIN方法的推荐替代方法,例如:</p><div class="ಠcopy-code-container"><pre><code cl...

JSON字段

<div id="s-643262271"><p>如果你的<code>user</code>表有一个<code>info</code>字段是<code>JSON</code>类型的(或者说你存储的是JSON格式,但并非是要JSON字段类型),你可以使用下面...

子查询

<div id="s-643262271"><p>首先构造子查询SQL,可以使用下面三种的方式来构建子查询。</p><h2><a id="fetchSql_2"></a>使用<code>fetchSql</code>方法</h2><p>fetchSql方法...

原生查询

<div id="s-643262271"><p><code>Db</code>类支持原生<code>SQL</code>查询操作,主要包括下面两个方法:</p><blockquote class="danger"><p><code>V6.0.3+</co...

获取查询参数

<div id="s-643262271"><h1><a id="_0"></a>获取数据库查询参数</h1><p>有时候我们的查询条件是不固定的,这时候我们可以通过<code>getOptions()</code>获取最终的查询条件.<br/>这样我们可...

查询事件

<div id="s-643262271"><h2><a id="_0"></a>查询事件</h2><p>数据库操作的回调也称为查询事件,是针对数据库的CURD操作而设计的回调方法,主要包括:</p><table><thead><tr><th>事件</th...

获取器

<div id="s-643262271"><h2><a id="_0"></a>获取器</h2><p>Db类也可以支持获取器定义,例如:</p><div class="ಠcopy-code-container"><pre><code class="ಠhi...

事务操作

<div id="s-643262271"><blockquote class="danger"><p>使用事务处理的话,需要数据库引擎支持事务处理。比如 <code>MySQL</code> 的 <code>MyISAM</code> 不支持事务处理,需...

存储过程

<div id="s-643262271"><p>数据访问层支持存储过程调用,调用数据库存储过程使用下面的方法:</p><div class="ಠcopy-code-container"><pre><code class="ಠhighlight-conta...

数据集

<div id="s-643262271"><p>数据库的查询结果默认返回数据集对象。</p><div class="ಠcopy-code-container"><pre><code class="ಠhighlight-container"><span c...

数据库驱动

<div id="s-643262271"><h2><a id="_0"></a>数据库驱动</h2><p>如果你需要自定义数据库驱动,需要自定义实现<code>Connection</code>类(或者继承<code>think\db\Connectio...

模型

<div id="s-643262271"><p><a href="1037580">定义</a><br/><a href="1037581">模型字段</a><br/><a href="1037582">新增</a><br/><a href="10375...

定义

<div id="s-643262271"><h2><a id="_0"></a>模型定义</h2><p>定义一个模型类很简单,例如下面是一个<code>User</code>模型:</p><div class="ಠcopy-code-container"...

模型字段

<div id="s-643262271"><h2><a id="_0"></a>模型字段</h2><p>模型的数据字段和对应数据表的字段是对应的,默认会自动获取(包括字段类型),但自动获取会导致增加一次查询,因此你可以在模型中明确定义字段信息避免多一次查...

新增

<div id="s-643262271"><p>模型数据的新增和数据库的新增数据有所区别,数据库的新增只是单纯的写入给定的数据,而模型的数据写入会包含修改器、自动完成以及模型事件等环节,数据库的数据写入参考数据库章节。</p><h2><a id="_2"...

更新

<div id="s-643262271"><p>和模型新增一样,更新操作同样也会经过修改器、自动完成以及模型事件等处理,并不等同于数据库的数据更新,而且更新方法和新增方法使用的是同一个方法,通常系统会自动判断需要新增还是更新数据。</p><h2><a i...

删除

<div id="s-643262271"><p>模型的删除和数据库的删除方法区别在于,模型的删除会包含模型的事件处理。</p><h2><a id="_2"></a>删除当前模型</h2><p>删除模型数据,可以在查询后调用<code>delete</co...

查询

<div id="s-643262271"><p>模型查询和数据库查询方法的区别主要在于,模型中的查询的数据在获取的时候会经过获取器的处理,以及更加对象化的获取方式。</p><blockquote class="danger"><p>模型查询除了使用自身的...

查询范围

<div id="s-643262271"><p>可以对模型的查询和写入操作进行封装,例如:</p><div class="ಠcopy-code-container"><pre><code class="ಠhighlight-container"><spa...

JSON字段

<div id="s-643262271"><p>可以更为方便的操作模型的JSON数据字段。</p><blockquote class="default"><p>这里指的JSON数据包括JSON类型以及JSON格式(但并不是JSON类型字段)的数据</p>...

获取器

<div id="s-643262271"><h2><a id="_0"></a>获取器</h2><p>获取器的作用是对模型实例的(原始)数据做出自动处理。一个获取器对应模型的一个特殊方法(该方法必须为<code>public</code>类型),方法命名...

修改器

<div id="s-643262271"><h2><a id="_0"></a>修改器</h2><p>和获取器相反,修改器的主要作用是对模型设置的数据对象值进行处理。</p><p>修改器方法的命名规范为:</p><blockquote class="in...

搜索器

<div id="s-643262271"><h2><a id="_0"></a>搜索器</h2><p>搜索器的作用是用于封装字段(或者搜索标识)的查询条件表达式,一个搜索器对应一个特殊的方法(该方法必须是<code>public</code>类型),方法...

数据集

<div id="s-643262271"><h2><a id="_0"></a>数据集</h2><blockquote class="default"><p>模型的<code>select</code>查询方法返回数据集对象 <code>think\mo...

自动时间戳

<div id="s-643262271"><p>系统支持自动写入创建和更新的时间戳字段(默认关闭),有两种方式配置支持。</p><p>第一种方式是全局开启,在数据库配置文件中进行设置:</p><div class="ಠcopy-code-containe...

只读字段

<div id="s-643262271"><p>只读字段用来保护某些特殊的字段值不被更改,这个字段的值一旦写入,就无法更改。 要使用只读字段的功能,我们只需要在模型中定义<code>readonly</code>属性:</p><div class="ಠc...

软删除

<div id="s-643262271"><h2><a id="_0"></a>软删除</h2><p>在实际项目中,对数据频繁使用删除操作会导致性能问题,软删除的作用就是把数据加上删除标记,而不是真正的删除,同时也便于需要的时候进行数据的恢复。</p><...

类型转换

<div id="s-643262271"><p>支持给字段设置类型自动转换,会在写入和读取的时候自动进行类型转换处理,例如:</p><div class="ಠcopy-code-container"><pre><code class="ಠhighligh...

模型输出

<div id="s-643262271"><h2><a id="_0"></a>模型输出</h2><p>模型数据的模板输出可以直接把模型对象实例赋值给模板变量,在模板中可以直接输出,例如:</p><div class="ಠcopy-code-contai...

1 2