Think PHP 5.0手册笔记

Think PHP 5.0笔记手册

目录结构
application 应用目录(可设置)
index 模块目录 可以建立多个模块 例如 前台 后台
controller 控制器目录
model 模型目录
view 视图目录
config.php 模块配置文件
common.php 模块函数文件

command.php         命令行工具配置文件      当执行命令行的时候会读取此文件的配置
common.php          应用公共(函数)文件    此文件用于书写公共的函数(方法)可以在全局使用
config.php          应用(公共)配置文件    配置之后建立的模块会共用此配置文件
database.php        数据库配置文件	    链接收据库
tags.php            应用行为扩展定义文件    对url进行美化修改此文件的路由配置
route.php           路由配置文件            应用行为扩展  可以对框架进行扩展并不需要修改框架的源码我们可以通过向钩子  注册某些函数或者行为 来改变框架执行流程  从而引用其他扩展

extend                  扩展类库目录(可定义)  下载第三方库  之后适当的修改命名空间之后就可以使用了第三方类文件了

public                  WEB 部署目录(对外访问目录)
favicon.ico	    访问网页的时候标签页面会显示图标
static              静态资源存放目录(css,js,image)
index.php           应用入口文件 	     所有请求都必须进过此入口文件之后再进行转发
router.php          快速测试文件	     检测电脑是否安装Apache  如果没有则通过php来启动此框架
    进入到public目录下  输入  php -S localhost 8888(端口号) router.php  
    在浏览器输入  localhost:8888  进行查看  会看到框架已经启动成功
    ctrl+C  进行退出之后  在进行查看  则会无法进行访问
robots.txt	    搜索引擎爬虫文件         定义所有引擎的url是否需要爬取  例如 后台所有的url是不需要被爬取到的  而前台是允许 需要对此文件进行配置的  
.htaccess           用于 apache 的重写

runtime                 应用的运行时目录(可写,可设置)  运行时的缓存文件  日志  缓存  编译文件等

thinkphp                框架系统目录
lang                语言包目录
library             框架核心类库目录
    think           Think 类库包目录	      框架核心文件
    traits          系统 Traits 目录	      类库的扩展
tpl                系统模板目录		      框架模板文件  里面还有框架的默认模拟
    default_index.tpl      控制器模板文件
    dispatch_jump.tpl      成功失败跳转文件
    page_trace.tpl	   调试模板文件
	    think_exception.tpl    异常时的模板文件

base.php            基础定义文件    	      定义常量
composer.json       composer 定义文件         定义 composer 配置文件
console.php         控制台入口文件
convention.php      惯例配置文件	      框架配置文件
helper.php          助手函数文件(可选)

LICENSE.txt         授权说明文件
phpunit.xml         单元测试配置文件
README.md           README 文件   	      说明文件
start.php           框架引导文件	      框架启动文件

vendor   		    第三方类库目录(Composer)       通过composer安装的所有类库都会放到此文件

开发规范

目录和文件
目录使用小写+下划线
类库、函数文件统一以.php为后缀
类的文件名均以命名空间定义,并且命名空间的路径和类库文件所在路径一致
类文件采用驼峰法命名(首字母大写),其它文件采用小写+下划线命名
类名和类文件名保持一致,统一采用驼峰法命名(首字母大写)

函数和类、属性命名
类的命名采用驼峰法(首字母大写),例如 User、UserType,默认不需要添加后缀,例如UserController应该直接命名为User;
函数的命名使用小写字母和下划线(小写字母开头)的方式,例如 get_client_ip
方法的命名使用驼峰法(首字母小写),例如 getUserName
属性的命名使用驼峰法(首字母小写),例如 tableName、instance
以双下划线“__”打头的函数或方法作为魔术方法,例如 __call 和 __autoload

常量和配置
常量以大写字母和下划线命名,例如 APP_PATH和 THINK_PATH
配置参数以小写字母和下划线命名,例如 url_route_on 和url_convert

数据表和字段
数据表和字段采用小写加下划线方式命名,并注意字段名不要以下划线开头,例如 think_user 表和 user_name字段,不建议使用驼峰和中文作为数据表字段命名
应用类库命名空间规范
应用类库的根命名空间统一为app(不建议更改,可以设置app_namespace配置参数更改,V5.0.8版本开始使用APP_NAMESPACE常量定义);
例如:app\index\controller\Index和app\index\model\User

模块设计 控制器
拥有命名空间
对应的文件夹目录 app\admin\controller 应用主体\模块\文件夹名称(view controller model 等)
创建公共模块 common 不能直接访问
新建立controller和action 新建控制器和方法
想访问公共文件需要 use 将文件命名空间引入 需要用as起别名
use app\common\controller\Index as commonIndex;
调用 方法 use 引入 实例化进行调用 获取数据
重写公共的方法 继承 引入公共方法 use 引入as起别名 类继承(继承as之后的别名) 调用方法可以传递参数 重写父类

重要知识点
继承是PHP5面象对象程序设计的重要特性之一,它是指建立一个新的派生类,从一个或多个先前定义的类中继承数据和函数,而且可以重新定义或加进新数据和 函数,从而建立了类的层次或等级。
继承性是子类自动共享父类数据结构和方法的机制,这是类之间的一种关系。在定义和实现一个类的时候,可以在一个已经存在的类的基础之上来进行,把这个已经存在的类所定义的内容作为自己的内容,并加入若干新的内容

重定义配置文件
配置文件运行原理
public function configdemo()
{
//模拟框架配置
$onearr=[‘username’=>‘人生得意须尽欢’];
$twoarr=[‘userpwd’=>‘莫使金撙节空对月’];
// array_merge — 合并一个或多个数组
//数组分别代表两个配置文件 会将数组中相同键的值用第二个数组的值进行替换
//数组分别代表两个配置文件 如果数组中键不同则获奖两个数组中的健及对应的值全部以数组的形式展示出来

	var_dump(array_merge($onearr,$twoarr));
}

在入口文件定义配置文件路径 与app文件平级  并建立conf文件夹(固定名称)
惯例配置  convention.php  在此文件对框架进行配置
	
应用配置  在conf文件夹新建config.php文件  对全局进行配置
可以将配置数据库单独分离新建database.php文件 对数据进行配置  注意此文件需要将一数组的方式将所有的数据库配置放在此目录 数组的方式进行配置 (惯例配置将数据库配置复制到此文件就可以了)  
此配置文件可以修改所有的惯例配置

扩展配置  在文件夹新建extra文件夹 可以新建任何的配置扩展文件 
(当扩展的配置较多的时候应用以数组的形式进行配置  扩展较少建议在config文件直接进行配置 便于维护配置信息) 
扩展的名称会默认新建的文件名称  配置扩展的优先级高于config文件的的配置

模块配置  conf新建与app模块文件夹相同的文件夹 并新建config.php文件对模块进行配置 在模块下也可以采用扩展配置  此配置只对对应的模块有效

动态配置  可以通过config类与config助手类 对某个方法进行配置  详细配置方法参考config类与config助手类

config类与config助手类
    config类 
    config()  //第一个参数键值  第二个参数值  第三各参数作用域
    获取配置 config('scopes', 'demo')
    设置配置 config('homoconfig','Just set a value', 'demo')
    检测配置 config('?scope',null,'demo');
    config助手类
    获取配置 config::get('scopes', 'demo');  //第一个参数键值  第二个参数作用域
    设置配置 config::set('homoconfig','Just set a value', 'demo');  //第一个参数键值  第二个参数值  第三各参数作用域
    检测配置 config::has('scopes', 'demo');//第一个参数键值  第二个参数作用域

入口文件
入口文件可以改变一些系统默认的配置 必须引入/…/thinkphp/start.php 引导文件并进行安全过滤
可以参考thinkphp下base.php文件
绑定入口文件
//一个参数默认指定访问的模块 页面url需要补全控制器与方法
//两个参数第一个参数指定访问的模块 第二个参数是指定访问的控制器 页面url需要补全方法
// define(‘BIND_MODULE’,‘admin’);
// define(‘BIND_MODULE’,‘admin/Admin’);
也可以重新新建入口文件 例如接口的入口文件 用户使用接口并不希望访问index.php此入口文件 而且不想让用户访问其他模块其他的模块 地址栏也不出现其他的模块
新建api.php入口文件 提供接口 直接绑定用户所要访问的模块
//定义应用目录
define(“APP_PATH”,DIR.’/…/app/’);
//定义配置文件目录
define(“CONF_PATH”,DIR.’/…/conf/’);
//绑定模块 如果文件不存 会报错
define(‘BIND_MODULE’,‘api’);
//引入start.php
require(DIR.’/…/thinkphp/start.php’);

另一种开启config配置
    //配置开启路由
    //自动绑定模块  默认访问和入口文件文件相同的模块  如果文件不存在会默认访问index Index index
    'auto_bind_module'=>true,

重写路由 美化路由
开启配置 
    //配置开启路由
    'url_route_on'	 =>true,
    //如果开启此配置所有的url都必须自己配置路由规则  默认路由规则将会失效
    'url_route_must' =>false,
在conf文件夹新建路由配置  对路由进行重写
    return [
	'newslist/:names'=>'admin/Index/newsinfo',
	// 'adminIndex/index'=>'adminIndex/index',
    ];
原路由  http://www.xiaoyangluntan.com/index.php/admin/Index/newsinfo/names/nuonuo
配置后路由  http://www.xiaoyangluntan.com/index.php/newslist/names/nuonuo

请求与响应
请求对象
//第一种方法直接获取
$request = request();
//第二种方法通过类调用静态方法获取
//引入请求
use think\Request; 此类为单例模式
//调用方法获取实例
$request = Request::instance();
//注入对象 常用
//引入请求
use think\Request;
//在当前方法 index(Request $request)

请求对象参数
    //获取浏览器的url地址信息
    //获取域名部分
    // echo $request->domain(); 
    //获取访问请求路径
    // echo $request->pathinfo(); 
    //获取访问请求真实路径
    // echo $request->path();
    //获取当前访问请求的类型
    // echo $request->method();
    //判断请求的类型 如果正确 返回bool真 否则返回bool假
    // var_dump($request->isGet());  //isPost isAjax 等
    //获取当前访问请求的传输的值  如果是get只包含?后见的传值 不包含路径中的参数
    // var_dump($request->get());  post() session()获取session cookie 获取cookie  可以单独制定获取的参数
    //获取请求路径中的参数
    // var_dump($request->param());  可以单独制定获取的参数
    //获取请求的模块 控制器  方法
    echo $request->module();
    echo $request->controller();
    echo $request->action();
    //获取url 包含请求参数
    echo $request->url();
    //获取url 不包含请求参数
    echo $request->baseUrl();
其余可以参考thinkphp/libray/think/request.php文件对函数进行查看
input助手  建议使用$request
input() 第一个参数获取得值可以指定类型 第二个参数个定义默认值 第三个参数定义类型  如果类型不对会强制转换烈类型
可以获取 get post param session put sesion cookie delete 等等  具体可以参考input方法
相应对象
在方法尽量使用die  输出可以使用return  也可以返回数据
动态配置返回的数据类型 config::get('default_return_type','返回类型');	  

视图
加载视图
加载视图方法 view() 编写web应用建议不使用此方法 会引起冲突
不传参数默认会找与方法名相同的视图进行加载
传递一个参数 可以指定视图文件是哪个 index/home
当以./开有的时候会默认找入口文件public文件夹下对应的视图 ./index.html 注意需要加后缀名 当指定后缀名的时候 访问的页面必须含有与后缀名相同的文件
传递两个参数 第一个参数加载的页面 第二个参数想页面传输的数据 return vie(‘index/index’,[‘email’=>‘3039467782@qq.com’])
显示数据传递的数据 花括号里面写变量 {$email}

    传递三个参数    第一个参数加载的页面  第二个参数想页面传输的数据 第三个参数替换页面的内容 数组形式key值大写指向需要替换的值 return viwe('index/index',['email'=>'3039467782@qq.com'],['NAMES'=>'会将页面上搜有的NAME替换为此字符		串'])
    显示第三个参数直接写定义的大写字母键值 

fetch方法  需要继承think\Controller文件  使用模板文件  使用方法与view相同  return $this->fetch('index/index',['email'=>'3039467782@qq.com'],['NAMES'=>'会将页面上搜有的NAME替换为此字符串'])
display方法  需要继承think\Controller文件  加载模板  第一个参数向页面赋值的模板信息  第二个参数向页面赋值的模板信息  $this->display('这是加载的模板信息 邮箱{$email} 传值{$assign}',['email'=>'email 我是向页面传递的参数']); 在向页面赋值的时候可以传递参数变量
变量赋值
fetch方法 第二个参数在加载页面的时候向页面赋值
assign方法  需要继承think\Controller文件  向页面传输数据  $this->assign('参数名','参数值');
使用view对象进行赋值    $this->view->username='xueyalishang';
使用view对象方法进行赋值    View::share('keyshare','使用view对象share进行赋值');    
变量输出
在输出变量的时候为什么使用 {} 之后在 查看你运行文件就会用php语法将变量输出  可以查看 thinkphp convention.php 下模板配置进行查看
在输出变量的时候不允许变量 {} 中含有空格
四赋值之的方法可以同时有效  系统会将赋值的变量合并  之后统一向页页面赋值
变量替换
fetch方法 第三个参数 在加载页面的时候对页面变量进行替换
再配置文件中使用配置进行替换
在config配置文件配置 view_replace_str  再此配置中可以替换引入文件访问的路径  具有优先级可以替换系统默认的配置
    'view_replace_str'=>[
	'替换的值 作为键值'=>''替换成为的值,
	''__UPLOAD__=>'/uploads/',  //配置一个文件上传的路径
	],

系统提供的替换粒径的变量
__URL__  返回系统当前的模块与控制器名称和方法名
__STATIC__  入口文件静态文件夹  public/static
__JS__  入口文件静态文件下面的js文件夹  public/static/js
__CSS__  入口文件静态文件下面的css文件夹  public/static/css
__ROOT__  入口文件夹
模板变量
变量在前
在页面展示的时候对数据加密    {$email|md5} 此时会将邮箱进行MD5加密展示  md5($email)
在页面展示的时候对变量进行截取    {$email|substr=0,11} 此时会将邮箱进行截取 = 后面 第一个值为开始位置 第二个值为截取的长度    substr($email,0,11)
变量在后    ###  占位符  在运行的时候会将变量方法###的位置	
在展示页面的时候对时间进行格式化    {$times|date="Y-m-d H:i:s",###}  对时间进行格式化    date('Y-m-d H:i:s',$times)
模板循环标签
volist标签 循环列表展示
    id 		循环中的value
    offset	开始循环的位置 默认0  可以指定
    length	限制的次数
    mod		对当前循环的次数进行取余 默认保存在$mod 中 
    empty	当循环的数组不存在的时候  会提示此信息  html页面不可以解析标签 但通过变量赋值是可以解析的
    key		表示当前循环的次数		
foreach标签 循环标签
    name	循环的数组名称
    item	循环中的value
    key		循环中的键值
    简单写法
    {foreach $list as $value}
    	<p>{$value.username}</p>
    {/foreach}
for循环
    start	循环的开始数值
    end		循环的结束数值
    step	循环的递增数量 默认递增1
    name	指定循环变量的名称    默认  $i	
比较标签  以对应的符号组成双标签 传递参数进行判断    判断的值可以通过变量获得
相等
eq
    name	比较的变量名称
    value	比较的数值
equal  基本和eq相同
    name	比较的变量名称
    value	比较的数值
不等
neq
    name	比较的变量名称
    value	比较的数值
notequal 基本和neq相同
    name	比较的变量名称
    value	比较的数值
大于
gt 
    name	比较的变量名称
    value	比较的数值    
小于
lt
    name	比较的变量名称
    value	比较的数值 
大于等于
egt
    name	比较的变量名称
    value	比较的数值 
小于等于
qlt
    name	比较的变量名称
    value	比较的数值 
条件判断  以对应的符号组成双标签
switch	case
    name		需要进行选择的变量
    case value 	需要进行选择的值
    default		当判断结果不存在的时候显示内容
代码实践
{switch name="Think.get.level"}
	{case value="1"} <p>青铜</p> {/case}
	{case value="2"} <p>黄金</p> {/case}
	{case value="3"} <p>铂金</p> {/case}
	{case value="4"} <p>钻石</p> {/case}
	{case value="5|6"} <p>星耀</p> {/case}	可以利用|来指定多个值
	{default /} <p>段位不清楚</p>
{/switch}

range else
    name		需要进行选择的变量
    value		需要进行选择的值  可以为多个
    type		判断的类型
    in		判断值存在于value中
    notin	判断值不存在于value中
    between	判断值是否存在与两个值之中 value="1,5" 传递第三个参数无效
    notbetween	判断值是否bu存在与两个值之中 value="1,5" 传递第三个参数无效	
{range	name="Think.get.level" value="1,2,3,4,5" type="in"}
	<p>是存在的</p>
{else/}
	<p>对不起了</p>
{/range}
in 当type=in 的结果相同
{in name="Think.get.level" value="1,2,3,4,5"}
	<p>是存在的</p>
{else/}
	<p>对不起了</p>
{/in}
notin 当type=notin 的结果相同
{notin	name="Think.get.level" value="1,2,3,4,5"}
	<p>对不起了</p>
{else/}
	<p>是存在的</p>
{/notin}
between 当type=between 的结果相同
{between name="Think.get.level" value="1,5"}
	<p>在</p>
{else/}
	<p>不在</p>
{/between}
    判断系统常量是否定义
defined
    name		需要判断的常量 
{defined name="APP_PATH_NO"}
	<p>存在的</p>
{else/}
	<p>不存在</p>
{/defined}
if 标签不建议使用
    and		判断多个条件同时满足
    or		判断条件满足其一
    也可以使用 eq neq 等等
{if condition="($Think.get.level == 1) AND ($Think.get.id == 10) "} 
	条件满足
{else /} 
	条件不满足
{/if}

模板
模板 包含 include
在view新建公共的模板文件夹 common  并创建公共的模板 例如 nav(公共头部)
在对应的视图文件引入  {include file="common/nav" /}
模板继承  extecd
在common模板文件夹创见 继承的模板  此模板可以包含其他的模板
在对应的视图文件继承  {extend name="common/base" /}
模板替换  block    配置  __CONTENT__
block  替换局部内容 数量不要太多 不能和 __CONTENT__ 连用
    在common模板那文件夹下找到需要替换的内容 用block php双标签包住
    参数 name 指定替换的内容  标签内可以输入模板的内容
    {block name="title"}
	    我是默认的标签标题
     {/block}
    展示页面替换 使用block php双标签 与模板相同的名称 name 将替换的内容写在双标签里 就可以将默认的之替换掉
    {block name="title"}
	    我是修改的title
    {/block}
__CONTENT__ 替换/公共模板  在所有模板都会有效  此模板可以包含其他的模板 模板中只能有一个 
    配置文件 'layout_on' => true, //开启替换/公共模板 'layout_name' =>'layout', //设置默认的替换模板名称
    在common模板那文件夹下创建与配置模板文件相同的模板 并将页面放在此文件上
    将页面中需要替换的部分更改成为  {__CONTENT__} 之后在视图文件的页面  输出展示的任何信息  默认都会显示在此区域将 将视图文件的信息全部展示到这里
    如果想替换页面的书签title  我们为你可以将title更改成为变量  之后在加载页面的时候 通过assign将书签title替换掉

模型
连接/配置数据库
// 第一种方法 在config文件夹配置 引入DB类
// DB类直接静态调用
// $res=Db::connect();
//第二种方法 在调用静态方法的时候传递配置信息
// $res=Db::connect([
// ‘type’ => ‘mysql’, // 数据库类型
// ‘dsn’ => ‘’, // 数据库连接DSN配置
// ‘hostname’ => ‘127.0.0.1’, // 服务器地址
// ‘database’ => ‘month11_类配置’, // 数据库名
// ‘username’ => ‘root’, // 数据库用户名
// ‘password’ => ‘root’, // 数据库密码
// ‘hostport’ => ‘3306’, // 数据库连接端口
// ‘params’ => [], // 数据库连接参数
// ‘charset’ => ‘utf8’, // 数据库编码默认采用utf8
// ‘prefix’ => ‘’, // 数据库表前缀
// ]);
//\第三种方式 dsn配置 数据库类型://用户名:密码@数据库地址:数据库端口/数据库名#utf8 字符集
// $res=Db::connect(“mysql://root:root@127.0.0.1:3306/month11_dsn配置#utf8”);
// 第四种方法 在config文件里面新建立一个数据库配置模块 之后获取配置信息
// $res=Db::connect(Config::get(“db_congig_database”)); //Config可以省略
// $res=Db::connect(“db_congig_database”);

数据查询
原生
	//条件查询
	// $res=Db::query("select * from day12_common where c_id = ?",[1]);
构造器
	//构造器查询  查询所有结果 二维数组 结果不存在空数组
	// $res=Db::table('day12_common')->select();
	//构造器查询  查询单条结果 一维数组 不加条件默认数据正序排序第一条 结果不存在返回空
	// $res=Db::table('day12_common')->where(['c_id'=>19])->find();
	//查询某字段的数据 value  默认返回正序排序查询列的一条数据 不存在返回空  
	// $res=Db::table('day12_common')->value('content');
	// 查询某列的数据 column  默认查询全部 不存在返回空数组 
	// $res=Db::table('day12_common')->column('post_id','content','zan');
	//name 当含有表前缀的时候指定数据表的名称 可以连用 select find 等
	// $res=Db::table('day12_common')->find();
	//db方法  默认没查询一次会实例化一次 可以连用 select find 等 
	//取消实例化 db(‘表名’,[],false)
	// $res=db('day12_common')->find();
	// $res=db('day12_common',[],false)->select();

数据添加
原生
	// 添加数据
	// $res= Db::execute("INSERT INTO `day12_common` SET user_id=?, post_id=?, content=?",['3', '4', '喜欢对于现在的我而言  守护着她就够了']);
	
添加构造器
	// 添加数据
	// $res= Db::execute("INSERT INTO `day12_common` SET user_id=?, post_id=?, content=?",['3', '4', '喜欢对于现在的我而言  守护着她就够了']);
	
	//insert   返回影像记录的条数 行数 插入数
	// $res =Db::table('day12_common')->insert(['user_id'=>8, 'post_id'=>5, 'content'=>'记得你的明天并相信他会更美好']); 
	
	//insertGetId   返回当前插入数据库数据的id  
	// $res =Db::table('day12_common')->insertGetId(['user_id'=>4, 'post_id'=>6, 'content'=>'到任何的时候相信自己一定可以将持续爱去的']); 
	
	//insertAll返回插入数据成功的行数 date 添加数据的数组 可以通过比较数组的长度和添加之后的结果进行对比来查看数据是否正常添加

	// $res=Db::table('day12_common')->insertAll($date);

数据修改
原生
	//$res= Db::execute("UPDATE `day12_common` SET `content`=?,`zan`=? WHERE `c_id`=?",[ '相信自己并不比别人差','128','9']);

修改构造器
	//update 返回数据的影响行数
	// $res=Db::table('day12_common')->where(['c_id'=>3])->update(['content'=>"属于自己的悲伤总会过去 请不要放弃坚持下去"]);

	//setField  返回数据的影响行数  只能修改某一个字段
	// $res=Db::table('day12_common')->where(['c_id'=>4])->setField(['content'=>"喜欢一个人有的时候不一定需要比表达出来默默的守护着就行"]);
	
	//setInc 返回影响数据的条数 第一个参数 需要更新的字段 第二和参数 需要自增的数值
	// $res=Db::table('day12_common')->where(['c_id'=>6])->setInc('zan',2);
	
	//setDec 返回影响数据的条数 第一个参数 需要更新的字段 第二和参数 需要自减的数值
	// $res=Db::table('day12_common')->where(['c_id'=>6])->setDec('zan',2);

数据删除
原生
	//$res = Db::execute("DELETE FROM `day12_common` WHERE `c_id`=?",['11']);

删除构造器
	// 返回应先记录的行数 删除指定任意的条件
	// $res=Db::table('day12_common')->where(['c_id'=>13])->delete();
	
	//返回影响记录的条数 当删除的条件为主键的时候 可以默认使用delete 可以同时传入多个主键进行删除
	// $res=DB::table('day12_common')->delete('15,16,17');

条件构建起
	//输出原生的sql语句 buildSql
	//条件查询  建议使用三个参数的形式传递参数  where 一条语句可与使用多个where默认会以and连接
	//两个参数 第一个参数字段名称	 第二和参数值 可以模拟数据等于的情况  ('c_id',20)
	//三个参数 第一个参数字段名称 第二个参数表达式 第三个参数值 可以模拟大于 小于 不等于 等情况 ('c_id','>',20)  (['c_id'=>['lt',20]])
	//支持格式 字符串 "c_id=20" 数组 ["c_id=>20"]
	//运算符
	//EQ 	= 	等于
	//NEQ 	<> 	不等于
	//LT 	< 	小于
	//ELT 	<= 	小于等于
	//GT 	>	大于
	//EGT 	>= 	大于等于
	//BETWEEN  BRTWEEN * AND *    ('c_id','between',"20,25") ('c_id','between',[10,25])
	//NOTBETWEEN  NOTBETWEEN * AND *
	//IN IN (*,*) ('c_id','in',"20,21,22,23,24,25")  ('c_id','in',[20,21,22,23,24,25])
	//NOTIN NOT IN (*,*)
	//自定义连接条件 	('c_id',"EXP","not in (1,2,3,4,5)") 会将条件拼接到语句中
	
	//whereOr 一条语句可与使用多个whereOr默认会以or连接 语法与where相同

	$sql=DB::table('day12_common')->where(['c_id'=>['lt',20]])->buildSql();

链式操作
可以参考: https://www.kancloud.cn/manual/thinkphp5/135180  查找更多
	//在查询的时候指定查询的字段  field 字符串 数组
	//根据某字段排序 order 字符串 数组 ['c_id desc'] 注意空格 分开
	//限制查询的结果集 limit 第一个参数开始位置 第二个参数结束位置 字符串 传参
	//分页查询 page 第一个参数想要查询数据的页数 第二个参数想要查询数据的条数 字符串 传参
	//分组查找 按照某关键字进行分组 默认每组分类只会显示一条 group 与一些关键词不能连用 
	$list=DB::table('day12_common')
		->where(['c_id'=>['<',20]])
		->field(['c_id','post_id','content'])
		// ->order(['c_id desc'])
		// ->limit('0,5')
		// ->page('1,3')
		// ->group('groups')
		->select();

model 应用
	//继承model 简单调用获取数据
	//默认得到的数据是对象  toArray 将对象转换成为数据
	//静态调用获取数据
	// $res=Day12Common::get(1)->toArray();
	
	// 实例化调用
	// $model=new Day12Common;
	// $res=$model->get(2)->toArray();
	
	// 第三种方法 引入loader loader加载model 之后静态调用
	// 再控制器下使用过个模型 减少use引入  
	// $model=Loader::model('day12Common');
	// $res=$model::get(4)->toArray();
	
	//第四种方法 调用model 方法 获取model 之后静态调用 
	//助手函数 会产生替换 不建议使用
	// $model=model('day12Common');
	// $res=$model::get(3)->toArray();


模型查询
	//从对象指向获取某个字段数据
	// $res=Day12Common::get(5);
	// $content=$res->content;
	
	//通过model查询单条数据 默认返回对象 get 默认通过主键id进行查询 
	//model传输条件进行查询 可以使用/增加其的链式操作查询数据 例如field order等 
	// $res=Day12Common::get(function($query){
	// 	$query->where("c_id","=",5);
	// })->toArray();

	//model构造查询条件 默认返回对象 可以使用/增加其的链式操作查询数据 field order等 
	// $res=Day12Common::where('c_id',6)->find()->toArray();
	
	//获取多条数据 all查询多条 默认可以通过主键id进行查询 默认返回对象格式 可以对对象便利循转化成为数组
	// $res=Day12Common::all("1,2,3,4,5");
	
	//model传输条件进行查询 默认返回对象 可以使用/增加其的链式操作查询数据 例如field order等 
	// $res=Day12Common::all(function($query){
	// 	$query->where("c_id","<",4);
	// });

	// foreach ($res as $key => $value) {
	// 	$arr[]=$value->toArray();
	// }

	// 通过model查询某调数据中某个字段得值 将值以字符串的形式返回
	// $res=Day12Common::where("c_id","=",22)->value('content');

	//通过model 查询某列数据的值 将值保存到二维数组返回
	// $res=Day12Common::column('content','c_id');

模型添加
	//create 添加数据  第一个参数添加的数组 (必须保证添加的字段是数据库存在的否则会报错)
	//第二个参数为true  当数据库不存在添加的字段的时候是否继续添加 根据数据库进行添加 数据库没有此字段则不会添加 过滤掉不需要的字段名 
	//第二个参数 允许添加的字段(含有数据库字段的数组) 在添加的时候只会向数据库添加数组内指定的字段
	 
	//默认返回添加数据会的对象 
	// $res=Day12Common::create([
	// 	'user_id'=>6,
	// 	'post_id'=>9,
	// 	'content'=>"在很久的一段时间我可以照顾你 但是请不要多想",
	// 	'zan'=>100,
	// 	'groups'=>5
	// ],['user_id','post_id','content']);
	// // 此对象含有添加数据的id 可以获取 返回字符串
	// $c_id=$res->c_id;
	// echo $c_id."<br>";

	//实例化对象 向对象追加字段对象 save进行添加 返回添加数据影响记录的行数
	// $model=new Day12Common;
	// $model->user_id=13;
	// $model->post_id=14;
	// $model->content="在你没有归宿之前我会一直守护着你";
	// $model->zan=15;
	// $res=$model->save();
	//实例化对象 通过save以数组的形式添加数据
	//allowFielf true 对数据库的字段进行添加 不存在的字段不会添加 过滤掉不需要的字段名
	//allowFielf 数组 允许添加的字段 在添加的时候只会向数据库添加数组内指定的字段
	// $model=new Day12Common;
	// $res=$model->allowField(['user_id','post_id','content'])->save([
	// 	'user_id'=>39,
	// 	'post_id'=>21,
	// 	'content'=>"不管怎么样在什么情况下 只要你没有把我删掉 我会坚持下去",
	// 	'zan'=>30,
	// 	'groups'=>6
	// ]);
	
	//添加多条数据 默认会将添加之后的数储存在对象中
	//对象含有添加的数据的id 可以循环指向获取 或者toArray 将返回的对象转变成为数组
	// $model=new Day12Common;
	// $res=$model->saveAll([
	// 	[			
	// 		'user_id'=>41,
	// 		'post_id'=>42,
	// 		'content'=>"不管怎么样在什么情况下 只要你没有把我删掉 我会坚持下去",
	// 		'zan'=>40,
	// 		'groups'=>4
	// 	],
	// 	[			
	// 		'user_id'=>51,
	// 		'post_id'=>52,
	// 		'content'=>"不管怎么样在什么情况下 只要你没有把我删掉 我会坚持下去",
	// 		'zan'=>50,
	// 		'groups'=>5
	// 	],
	// 	[			
	// 		'user_id'=>61,
	// 		'post_id'=>62,
	// 		'content'=>"不管怎么样在什么情况下 只要你没有把我删掉 我会坚持下去",
	// 		'zan'=>60,
	// 		'groups'=>6
	// 	]
	// ]);

	// foreach ($res as $key => $value) {
	// 	$arr[]=$value->c_id;
	// 	// $arr[]=$value->toArray();
	// }

模型修改
	//update 当修改的内容存在主键的id 修改的时候可以不写where条件 默认会修改与内容中主键相同的一条数据 默认返回都含有数据的对象 推荐更新一些简单/不需要验证是否恒信成功的数据
	//第一个参数更新的数据  第二个参数 数组 修改的条件 ['c_id'=>32]
	//第二个参数 传递函数 以函数的形式添加修改的条件 可以使用/增加其的链式操作作为修改的条件
	// $res=Day12Common::update([	
	// 		'user_id'=>54,
	// 		'post_id'=>38,
	// 		'content'=>"每次听到这样子的话 我的心里就会疼和心酸  这是为什么",
	// 		'zan'=>20,
	// 		'groups'=>3
	// 	],function($query){
	// 		$query->where(['c_id'=>['>',40]]);
	// 	});

	//传递where进行修改 可以判断结果表是否执行成功 返回值影响记录的条数
	// $res=Day12Common::where('c_id','>',"38")->where('c_id','<',"40")->update([	
		// 	'user_id'=>15,
		// 	'post_id'=>41,
		// 	'content'=>"像这样我不知道我还能坚持多久 但是相信自己一定可以克服的 因为自己就这样",
		// 	'zan'=>50,
		// 	'groups'=>1
		// ]);
	
	// 使用模型对象查询修改的数据 对数据进行重新赋值 通过save进行更改
	// $onedata=day12Common::get(38);
	// $onedata->user_id=99;
	// $onedata->post_id=1;
	// $onedata->zan=100;
	// $onedata->content='我能体会的出来在他的心里我已经不存在了 在很久之前就是这样';
	// $res=$onedata->save();

	//通过save 传值对数进行更新 修改的信息不包含主键 会出现问题 返回影响记录的行数
	//第一个参数修改的数据 第二个 数组 参数修改的条件 ['c_id'=>37]
	// $model=new day12Common;
	// $res=$model->save([
		// 	'user_id'=>98,
		// 	'post_id'=>5648,
		// 	'content'=>"现在我只想说回忆那么殇",
		// ],function($query){
		// 	$query->where(['c_id'=>['=',36]]);
		// });
	//批量更新数据 saveAll 通过数组中的主键对数据进行更新 同样修改之后也可以循环对象获取数据 
	// $model=new day12Common;
// 	$res=$model->saveAll([
// 			[
// 				'c_id'=>34,
	// 			'user_id'=>87,
	// 			'post_id'=>4396,
	// 			'content'=>"这是我的毛病总是喜欢一味的索取",
// 			],
// 			[
// 				'c_id'=>35,
	// 			'user_id'=>74,
	// 			'post_id'=>2642,
	// 			'content'=>"却忘记了他和我一样也是同样需要的",
// 			],
// 			[
// 				'c_id'=>33,
	// 			'user_id'=>46,
	// 			'post_id'=>9874,
	// 			'content'=>"还有一些坏毛病就是不去问正式的想法自己为他人决定问题",
// 			]
	// 	]);

模型删除
	//destory() 传值 数组 默认可以通过主键的id对数据进行删除 可以通过数组传递其他的字段作为条件进行删除  返回影像数据的行数
	// $res=day12Common::destroy(['c_id'=>21]);
	//以函数的形式添加修改的条件 可以使用/增加其的链式操作作为删除的条件
	// $res=day12Common::destroy(function($query){
	// 	$query->where(['c_id'=>['<',43]]);
	// });

	//获取单挑数据对象 之后通过delete对数据进行删除 返回影响记录的行数
	// $onedata=day12Common::get(89);
	// $res=$onedata->delete();

	//设置条件对数据进行删除 返回影响记录的行数
	// $res=day12Common::where(['c_id'=>['=',77]])->delete();


模型聚合函数的应用 模型聚合
	//使用聚合函数计算数据的条数
	// $res=day12Common::count();
	//计算点赞数量大于100的数据条数
	// $res=day12Common::where('zan','>=',50)->count();
	// 查询点赞数量的最大值
	// $res=day12Common::max('zan');
	//查询数据中c_id小于80的最大点赞数量
	// $res=day12Common::where('c_id','<',80)->max('zan');
	//计算数据中某字段的和
	// $res=day12Common::sum('zan');
	//查询数据中c_id小于80的点赞量的和
	// $res=day12Common::where('c_id','<',80)->sum('zan');
	// 计算某字段的平均值
	// $res=day12Common::avg('zan');
	// 计算c_id大于90的点赞量的平均值
	// $res=day12Common::where('c_id','>',90)->avg('zan');
	// 计算某字段数据的最小值
	// $res=day12Common::min('zan');
	//计算数据中大于95的数据中最小的点赞量
	// $res=day12Common::where('c_id','>',95)->min('zan');


模型获取器
在model层
//对输出的值进行处理
public function getGroupsAttr($value){
	switch ($value) {
		case '1':
			return "青铜";
			break;
		case '2':
			return "白银";
			break;
		case '3':
			return "黄金";
			break;
		case '4':
			return "钻石";
			break;				
		case '5':
			return "星耀";
			break;
		case '6':
			return "王者";
			break;
		default:
			return "未知";
			break;
	}
}
在控制器
public function listshow()
{
	//在model数据进行处理之后直接返回
	$res=day12Common::get(83);
	$result=$res->toArray();
	//获取原数据 getData
	$data=$res->getData();
	var_dump($result);
	var_dump($data);
}
获取数据的结果
array(6) {
  ["c_id"]=>
  int(83)
  ["user_id"]=>
  int(4)
  ["post_id"]=>
  int(6)
  ["content"]=>
  string(60) "到任何的时候相信自己一定可以将持续爱去的"
  ["zan"]=>
  int(0)
  ["groups"]=>
  string(6) "青铜"
}
array(6) {
  ["c_id"]=>
  int(83)
  ["user_id"]=>
  int(4)
  ["post_id"]=>
  int(6)
  ["content"]=>
  string(60) "到任何的时候相信自己一定可以将持续爱去的"
  ["zan"]=>
  int(0)
  ["groups"]=>
  int(1)
}

模型修改器
控制器层
public function savedata()
{
	$data=[
		'user_id'=>654,
		'post_id'=>987654,
		'content'=>"诺诺我有可能会喜欢上你 依赖上你",
		'useremail'=>'3039467782@qq.com',
		'zan'=>12,
		'groups'=>5
	];
	$res=day12Common::create($data);
	var_dump($res);
}
model层
//设置数据 以指定的格式向数据库添加
public function setUseremailAttr($value)
{
	return md5($value);
}

自动完成器
model层
//三个受保护的方法设置字段
//在执行任何增删改查操作的时候会自动执行
protected $auto=['time'];
//在添加操作的时候会执行
protected $insert=['creattime'];
//在修改操作的时候会执行
protected $update=['updatetime'];

//在对应的方法执行对应的操作
//设置时间 当执行curd操作的时候自动进行添加
public function setTimeAttr()
{
	return time();
}
//设置时间 当执行添加操作的时候自动进行添加
public function setCreattimeAttr()
{
	return time();
}
//设置时间 当执行修改操作的时候自动进行修改
public function setUpdatetimeAttr()
{
	return time();
}
控制器层
public function savedata()
{
	$data=[
		'user_id'=>654,
		'post_id'=>987654,
		'content'=>"诺诺我有可能会喜欢上你 依赖上你",
		'useremail'=>'3039467782@qq.com',
		'zan'=>12,
		'groups'=>5
	];

	$res=day12Common::create($data);

	// $onedata=day12Common::get(103);
	// $onedata->content='诺诺会照顾你,但是我不会接受你';


修改添加和修改时间
方法一
在配置文件进行配置 对全局有效 当数据库不包含时间的时候会报错  而且时间的名字 默认 create_time update_time
    'auto_timestamp'  => false,        // 自动写入时间戳字段
方法二
当将设置时间得值为false时 添加字段将不会被添加 
protected $autoWriteTimestamp=true;	//设置当前数据表开启自增时间  默认字段名为 create_time update_time
protected $createTime='inserttime'; //设置添加时间的字段名称为 inserttime
protected $updateTime="updatetime";  //设置添加时间的字段名称为 updatetime

软删除 假删除
在model 引入类  use traits\model\SoftDelete;
在类内	use SoftDelete;
在建立数据库的时候 新增字段 delete_time 默认值设置为空
在控制器使用对数据进行删除 destory  此时在删除的时候会修改删除的时间 数据不会被真正的删除
想要查询数据并且包含删除过的数据使用 withTrashed(true)  会将已经删除的数据显示出来
只想要查询已经删除的数据使用 onlyTrashed()  会将所有的已经删除的数据展示出来  之后循环获取元数据 getData() 就可以对数据进行查看
想要恢复数据使用修改将delete_time字段设置为空

想要制定删除的字段名字
protected $deleteTime="deletetime"  //设置假删除的的字段名称为 deletetime

想要真正的将数据删除掉 destory(第一个参数删除数据的主键ID,true) //将数据真正删除掉
获取需要删除的数据保存在对象 之后用过delete(true)  //将数据真正的删除

常用语句
获取数据
	//从对象指向获取某个字段数据
	// $res=Day12Common::get(5);
	// $content=$res->content;

链接数据库
	// 在config文件夹配置  引入DB类 use think\Db;
	// DB类直接静态调用
	// $res=Db::connect();

检测model是否连接成功
	//继承model 简单调用获取数据
	//默认得到的数据是对象  toArray 将对象转换成为数据
	//静态调用获取数据
	// $res=Day12Common::get(1)->toArray();

	// 引入loader loader加载model 之后静态调用
	// 再控制器下使用多个模型 减少use引入  
	// $model=Loader::model('day12Common');
	// $res=$model::get(4)->toArray();

查询
	//查询单条数据 二维数组 不加条件默认数据正序排序第一条 结果不存在空
	// $res=Db::table('day12_common')->where(['c_id'=>19])->find();

	// 查询某列的数据 column  默认查询全部 不存在返回空数组 
	// $res=Db::table('day12_common')->column('post_id','content','zan');
	
	//构造器查询  查询所有规定字段的结果  二维数组 结果不存在空数组
	// $res=Db::table('day12_common')->field(['c_id','post_id','content'])->select();

model查询
	//通过model查询单条数据 默认返回对象 get 默认通过主键id进行查询 
	//model传输条件进行查询 可以使用/增加其的链式操作查询数据 例如field order等 
	// $res=Day12Common::get(function($query){
	// 	$query->where("c_id","=",5);
	// })->toArray();

	//model构造查询条件 默认返回对象 可以使用/增加其的链式操作查询数据 field order等 
	// $res=Day12Common::where('c_id',6)->find()->toArray();

	//model传输条件进行查询 默认返回对象 可以使用/增加其的链式操作查询数据 例如field order等 
	// $res=Day12Common::all(function($query){
	// 	$query->where("c_id","<",4);
	// });

添加
	//insert   返回影像记录的条数 行数 插入数
	// $res =Db::table('day12_common')->insert(['user_id'=>8, 'post_id'=>5, 'content'=>'记得你的明天并相信他会更美好']); 
	
	//insertGetId   返回当前插入数据库数据的id  
	// $res =Db::table('day12_common')->insertGetId(['user_id'=>4, 'post_id'=>6, 'content'=>'到任何的时候相信自己一定可以将持续爱去的']); 

  	//insertAll返回插入数据成功的行数
	// $res=Db::table('day12_common')->insertAll($date);

model添加
	//create 添加数据  第一个参数添加的数组 (必须保证添加的字段是数据库存在的否则会报错)
	//第二个参数为true  当数据库不存在添加的字段的时候是否继续添加 根据数据库进行添加 数据库没有此字段则不会添加 
	//第二个参数 允许添加的字段(含有数据库字段的数组) 在添加的时候只会向数据库添加数组内指定的字段
	 
	//默认返回添加数据会的对象 
	// $res=Day12Common::create([
	// 	'user_id'=>6,
	// 	'post_id'=>9,
	// 	'content'=>"在很久的一段时间我可以照顾你 但是请不要多想",
	// 	'zan'=>100,
	// 	'groups'=>5
	// ],['user_id','post_id','content']);
	// // 此对象含有添加数据的id 可以获取 返回字符串
	// $c_id=$res->c_id;

	//实例化对象 向对象追加字段对象 save进行添加 返回添加数据影响记录的行数
	// $model=new Day12Common;
	// $model->user_id=13;
	// $model->post_id=14;
	// $model->content="在你没有归宿之前我会一直守护着你";
	// $model->zan=15;
	// $res=$model->save();
	//添加多条数据 默认会将添加之后的数储存在对象中
	//对象含有添加的数据的id 可以循环指向获取 或者toArray 将返回的对象转变成为数组
	// $model=new Day12Common;
	// $res=$model->saveAll([
	// 	[			
	// 		'user_id'=>41,
	// 		'post_id'=>42,
	// 		'content'=>"不管怎么样在什么情况下 只要你没有把我删掉 我会坚持下去",
	// 		'zan'=>40,
	// 		'groups'=>4
	// 	],
	// 	[			
	// 		'user_id'=>51,
	// 		'post_id'=>52,
	// 		'content'=>"不管怎么样在什么情况下 只要你没有把我删掉 我会坚持下去",
	// 		'zan'=>50,
	// 		'groups'=>5
	// 	],
	// 	[			
	// 		'user_id'=>61,
	// 		'post_id'=>62,
	// 		'content'=>"不管怎么样在什么情况下 只要你没有把我删掉 我会坚持下去",
	// 		'zan'=>60,
	// 		'groups'=>6
	// 	]
	// ]);

修改
	//update 返回数据的影响行数
	// $res=Db::table('day12_common')->where(['c_id'=>3])->update(['content'=>"属于自己的悲伤总会过去 请不要放弃坚持下去"]);

	//setField  返回数据的影响行数  只能修改某一个字段
	// $res=Db::table('day12_common')->where(['c_id'=>4])->setField(['content'=>"喜欢一个人有的时候不一定需要比表达出来默默的守护着就行"]);
	
	//setInc 返回影响数据的条数 第一个参数 需要更新的字段 第二和参数 需要自增的数值
	// $res=Db::table('day12_common')->where(['c_id'=>6])->setInc('zan',2);
	
	//setDec 返回影响数据的条数 第一个参数 需要更新的字段 第二和参数 需要自减的数值
	// $res=Db::table('day12_common')->where(['c_id'=>6])->setDec('zan',2);

model修改
	//update 当修改的内容存在主键的id 修改的时候可以不写where条件 默认会修改与内容中主键相同的一条数据 默认返回都含有数据的对象 推荐更新一些简单/不需要验证是否恒信成功的数据 没有办法查看是否更改成功
	//第一个参数更新的数据  第二个参数 数组 修改的条件 ['c_id'=>32]
	//第二个参数 传递函数 以函数的形式添加修改的条件 可以使用/增加其的链式操作作为修改的条件
	// $res=Day12Common::update([	
	// 		'user_id'=>54,
	// 		'post_id'=>38,
	// 		'content'=>"每次听到这样子的话 我的心里就会疼和心酸  这是为什么",
	// 		'zan'=>20,
	// 		'groups'=>3
	// 	],function($query){
	// 		$query->where(['c_id'=>['>',40]]);
	// 	});

 	// 使用模型对象查询修改的数据 对数据进行重新赋值 通过save进行更改
	// $onedata=day12Common::get(38);
	// $onedata->user_id=99;
	// $onedata->post_id=1;
	// $onedata->zan=100;
	// $onedata->content='我能体会的出来在他的心里我已经不存在了 在很久之前就是这样';
	// $res=$onedata->save();

	//批量更新数据 saveAll 通过数组中的主键对数据进行更新 同样修改之后也可以循环对象获取数据 没有办法查看是否更数据成功 
	// $model=new day12Common;
// 	$res=$model->saveAll([
// 			[
// 				'c_id'=>34,
	// 			'user_id'=>87,
	// 			'post_id'=>4396,
	// 			'content'=>"这是我的毛病总是喜欢一味的索取",
// 			],
// 			[
// 				'c_id'=>35,
	// 			'user_id'=>74,
	// 			'post_id'=>2642,
	// 			'content'=>"却忘记了他和我一样也是同样需要的",
// 			],
// 			[
// 				'c_id'=>33,
	// 			'user_id'=>46,
	// 			'post_id'=>9874,
	// 			'content'=>"还有一些坏毛病就是不去问正式的想法自己为他人决定问题",
// 			]
	// 	]);

删除
	// 返回应先记录的行数 删除指定任意的条件
	// $res=Db::table('day12_common')->where(['c_id'=>13])->delete();
	
	//返回影响记录的条数 当删除的条件为主键的时候 可以默认使用delete 可以同时传入多个主键进行删除
	// $res=DB::table('day12_common')->delete('15,16,17');

model删除
	//destory() 传值 数组 默认可以通过主键的id对数据进行删除 可以通过数组传递其他的字段作为条件进行删除  返回影像数据的行数
	//以函数的形式添加修改的条件 可以使用/增加其的链式操作作为删除的条件
	// $res=day12Common::destroy(function($query){
	// 	$query->where(['c_id'=>['<',43]]);
	// });

	//获取单挑数据对象 之后通过delete对数据进行删除 返回影响记录的行数
	// $onedata=day12Common::get(89);
	// $res=$onedata->delete();

版权声明:本文为qq_42725383原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。