thinkphp urldb助手函数数后面的地址前面有加‘/' 和没加有什么区别?


ThinkPHP中有大量重要的单字母函数,在开发过程中,这些函数极大的提高了开发人员的项目开发体验,今天我们就来扒一扒那些单字母函数
ThinkPHP函数:M 实例化模型(无需定义模型类)M方法用于实例化一个基础模型类,和D方法的区别在于:
1、不需要自定义模型类,减少IO加载,性能较好; 2、实例化后只能调用基础模型类(默认是Model类)中的方法; 3、可以在实例化的时候指定表前缀、数据库和数据库的连接信息;
M方法的调用格式:M('[基础模型名:]模型名','数据表前缀','数据库连接信息')
实例化基础模型(Model) 类
在没有定义任何模型的时候,我们可以使用下面的方法实例化一个模型类来进行操作://实例化User模型
$User = M('User');
//执行其他的数据操作
$User->select();
实例化其他公共模型类
第一种方式实例化因为没有模型类的定义,因此很难封装一些额外的逻辑方法,不过大多数情况下,也许只是需要扩展一些通用的逻辑,那么就可以尝试下面一种方法。$User = M('CommonModel:User');改用法其实等效于:$User = new CommonModel('User');
传入表前缀、数据库和其他信息
M方法有三个参数,第一个参数是模型名称(可以包括基础模型类和数据库),第二个参数用于设置数据表的前缀(留空则取当前项目配置的表前缀),第三个参数用于设置当前使用的数据库连接信息(留空则取当前项目配置的数据库连接信息),例如:$User = M('db2.User','think_');了解更多用法,可以查看官方文档ThinkPHP函数:N 计数器N方法属于计数器方法,被用于核心的查询、缓存统计的计数和统计,调用格式:N('计数位置'[,'步进值'])
N(‘计数位置’[,’步进值’])
例如,我们要统计页面中的查询次数,可以用N('read',1);表示每次执行到该位置都会引起计数器加1,到页面结束之前,我们就可以用$count = N('read');了解更多用法,可以查看官方文档ThinkPHP函数:R 直接调用控制器的操作方法R方法用于调用某个控制器的操作方法,是A方法的进一步增强和补充.R方法的调用格式:R('[项目://][分组/]模块/操作','参数','控制器层名称')例如,我们定义了一个操作方法为:class UserAction extends Action {
public function detail($id){
return M('User')->find($id);
}
}那么就可以通过R方法在其他控制器里面调用这个操作方法(一般R方法用于跨模块调用)$data = R('User/detail',array('5'));表示调用User控制器的detail方法(detail方法必须是public类型),返回值就是查询id为5的一个用户数据。如果你要调用的操作方法是没有任何参数的话,第二个参数则可以留空,直接使用:$data = R('User/detail');了解更多用法,可以查看官方文档ThinkPHP函数:S 缓存设置和存取U方法用于完成对缓存设置和存取ThinkPHP函数:U URL地址生成U方法用于完成对URL地址的组装,特点在于可以自动根据当前的URL模式和设置生成对应的URL地址,格式为: U('地址','参数','伪静态','是否跳转','显示域名');在模板中使用U方法而不是固定写死URL地址的好处在于,一旦你的环境变化或者参数设置改变,你不需要更改模板中的任何代码。在模板中的调用格式需要采用{:U('地址', '参数'…)} 的方式U方法的用法示例:U('User/add') // 生成User模块的add操作地址也可以支持分组调用:U('Home/User/add') // 生成Home分组的User模块的add操作地址当然,也可以只是写操作名,表示调用当前模块的U('add') // 生成当前访问模块的add操作地址除了分组、模块和操作名之外,我们也可以传入一些参数:U('Blog/read?id=1') // 生成Blog模块的read操作 并且id为1的URL地址了解更多用法,可以查看官方文档ThinkPHP函数:session Session操作Session方法用于Session 设置、获取、删除和管理操作。
session初始化设置
如果session方法的name参数传入数组则表示进行session初始化设置,例如:session(array('name'=>'session_id','expire'=>3600));
session赋值
Session赋值比较简单,直接使用:session('name','value');
//设置session相当于:$_SESSION['name'] = 'value';了解更多用法,可以查看官方文档ThinkPHP函数:cookie Cookie操作cookie函数也是一个多元化操作函数,完成cookie的设置、获取和删除操作。
Cookie设置
cookie('name','value');
//设置cookie
cookie('name','value',3600); // 指定cookie保存时间
Cookie获取
获取cookie很简单,无论是怎么设置的cookie,只需要使用:$value = cookie('name');
Cookie删除
删除某个cookie的值,使用:cookie('name',null);要删除所有的Cookie值,可以使用cookie(null); // 清空当前设定前缀的所有cookie值
cookie(null,'think_'); //
清空指定前缀的所有cookie值了解更多用法,可以查看官方文档ThinkPHP函数:import 类库导入import方法是ThinkPHP框架用于类库导入的封装实现,尤其对于项目类库、扩展类库和第三方类库的导入支持。调用格式:import('类库名', '起始路径', '类库后缀')imprt方法有一个别名vendor方法,专门用于导入第三方类库,区别在于起始路径和类库后缀默认值不同。
导入系统基类库
系统基类库其实就是指的Think类库包,所在目录就是指框架的核心Lib目录,import方法可以用于导入系统基类库,例如:import('Think.Util.Array');表示导入系统目录下面的Lib/Util/Array.class.php 类库文件,相当于我们这样使用require THINK_PATH.'Lib/Util/Array.class.php';
导入扩展类库
扩展类库位于Extend/Library目录下面,这是系统的公共扩展类库目录,目前支持的扩展类库包只有ORG和Com包。import('ORG.Util.Image');
import('Com.Sina.OAuth');
导入非标准类库文件
这里所说的非标准类库文件,主要是指位于特殊位置或者非.class.php后缀的类库文件。像导入基类库、扩展类库和项目类库都是基于框架规范的目录下面,如果我们需要导入项目的Common目录下面的MyClass.php文件,则可以采用:import('Common.MyClass',APP_PATH,'.php');了解更多用法,可以查看官方文档
查看更多文章请点击进入我的个人博客
}
定义路由规则之后,我们可以通过Url类来方便的生成实际的URL地址(路由地址),针对上面的路由规则,我们可以用下面的方式生成URL地址。// 输出 blog/thinkphp
Url::build('blog/read', 'name=thinkphp');
Url::build('blog/read', ['name' => 'thinkphp']);
// 输出 blog/5
Url::build('blog/get', 'id=5');
Url::build('blog/get', ['id' => 5]);
// 输出 blog/2015/05
Url::build('blog/archive', 'year=2015&month=05');
Url::build('blog/archive', ['year' => '2015', 'month' => '05']);
提示:
build方法的第一个参数使用路由定义中的完整路由地址。
我们还可以使用系统提供的助手函数url来简化url('blog/read', 'name=thinkphp');
// 等效于
Url::build('blog/read', 'name=thinkphp');
通常在模板文件中输出的话,可以使用助手函数,例如:{:url('blog/read', 'name=thinkphp')}
如果我们的路由规则发生调整,生成的URL地址会自动变化。
如果你配置了url_html_suffix参数的话,生成的URL地址会带上后缀,例如:'url_html_suffix'
=> 'html',
那么生成的URL地址 类似blog/thinkphp.html
blog/2015/05.html
如果你的URL地址全部采用路由方式定义,也可以直接使用路由规则来定义URL生成,例如:url('/blog/thinkphp');
Url::build('/blog/8');
Url::build('/blog/archive/2015/05');
生成方法的第一个参数一定要和路由定义的路由地址保持一致,如果你的路由地址比较特殊,例如使用闭包定义的话,则需要手动给路由指定标识,例如:// 添加hello路由标识
Route::rule(['hello','hello/:name'], function($name){
return 'Hello,'.$name;
});
// 根据路由标识快速生成URL
Url::build('hello', 'name=thinkphp');
// 或者使用
Url::build('hello', ['name' => 'thinkphp']);
目前为止,我们掌握的路由功能还只是ThinkPHP5.0路由功能的冰山一角,以后我们还会通过更多的专题来讲解路由。
【 5.1 】使用须知
5.1版本,你需要引入think\facade\Url才能使用静态方法调用,其它用法不变。
}
命令行php think list - 查看所有可用的命令列表php think help [command] - 查看指定命令的帮助信息php think build - 生成运行时文件php think clear - 清空应用的缓存、日志等文件php think optimize - 优化应用的性能php think make:controller [module/]controller - 创建控制器文件php think make:model [module/]model - 创建模型文件php think make:view [module/]controller/view - 创建视图文件php think make:middleware [module/]middleware - 创建中间件文件php think make:validate [module/]validate - 创建验证器文件php think make:command [module/]command - 创建命令行文件php think make:bind [module/]bind - 创建路由绑定文件php think make:provider [module/]provider - 创建服务提供者文件php think make:event [module/]event - 创建事件文件php think make:listener [module/]listener - 创建事件监听器文件php think make:config [module/]config - 创建配置文件php think make:middlewaregroup [module/]middlewaregroup - 创建中间件分组文件php think make:exception [module/]exception - 创建异常处理文件php think route:list - 查看路由列表php think route:check - 检查路由是否正确php think route:cache - 生成路由缓存文件php think route:clear - 清除路由缓存文件php think migrate:status - 查看迁移状态php think migrate:run - 执行数据库迁移php think migrate:rollback - 回滚数据库迁移php think migrate:create [migration_name] - 创建数据库迁移php think seed:run - 执行种子数据php think seed:create [seed_name] - 创建种子数据php think queue:work - 启动队列工作进程php think queue:listen - 启动队列监听进程php think queue:restart - 重启队列监听进程php think queue:stop - 停止队列监听进程php think queue:flush - 清空队列任务以上命令是ThinkPHP框架中常用的一些命令,可以帮助开发者提高开发效率。卸载插件composer remove thans/tp-jwt-auth 开启注解路由composer require topthink/think-annotation 开启多应用composer require topthink/think-multi-app 隐藏入口文件location / { // …..省略部分代码 if (!-f $request_filename) { rewrite ^(.*)$ /index.php?s=/$1 last; } } tp6常用扩展安装字符串操作扩展类库composer require topthink/think-helper 以下类库都在\think\helper命名空间下use think\\helper\\Str; // 检查字符串中是否包含某些字符串 Str::contains($haystack, $needles) // 检查字符串是否以某些字符串结尾 Str::endsWith($haystack, $needles) // 获取指定长度的随机字母数字组合的字符串 Str::random($length = 16) // 字符串转小写 Str::lower($value) // 字符串转大写 Str::upper($value) // 获取字符串的长度 Str::length($value) // 截取字符串 Str::substr($string, $start, $length = null) //驼峰转下划线 Str::snake($value, $delimiter = '_') //下划线转驼峰(首字母小写) Str::camel($value) //下划线转驼峰(首字母大写) Str::studly //转为首字母大写的标题格式 Str::title($value) 数组扩展库use think\\helper\\Arr; 判断能否当做数组一样访问//数组返回真 //模型查询的结果也为真 Arr::accessible($value) 向数组添加一个元素,支持"点"分割Arr::add($array, $key, $value) //如下操作 $arr = []; $arr = Arr::add($arr,'name.3.ss','thinkphp'); //本行结果$arr['name'][3]['ss'] = 'thinkphp' Arr::add($arr,'name','thinkphp2');//本行不会产生影响,因为'name'已存在. 将数据集管理类转换为数组Arr::collapse($array) 排列数组组合$arr = Arr::crossJoin(['dd'],['ff'=>'gg'],[2],[['a'=>'mm','kk'],'5']); //上面行没有什么意义,但是可以看到该函数的作用,数组索引被忽略,数组得值被全部组合 $arr = Arr::crossJoin(['a','b','c'],['aa','bb','cc','dd']); //这一行可以看到组合的效果,返回一个二维数组,第二维每个数组是的给定值排列,比如(a,aa),(a,bb),(a,cc)...直到(c,dd) 助手函数系统为一些常用的操作方法封装了助手函数,便于使用,包含如下:助手函数描述abort中断执行并发送HTTP状态码app快速获取容器中的实例 支持依赖注入bind快速绑定对象实例cache缓存管理class_basename 获取类名(不包含命名空间)class_uses_recursive 获取一个类里所有用到的traitconfig获取和设置配置参数cookieCookie管理download获取\think\response\File对象实例dump浏览器友好的变量输出env获取环境变量event触发事件halt变量调试输出并中断执行input获取输入数据 支持默认值和过滤invoke调用反射执行callable 支持依赖注入jsonJSON数据输出jsonpJSONP数据输出lang获取语言变量值parse_name字符串命名风格转换redirect重定向输出request获取当前Request对象response实例化Response对象sessionSession管理token生成表单令牌输出trace记录日志信息trait_uses_recursive获取一个trait里所有引用到的traiturlUrl生成validate实例化验证器view渲染模板输出display渲染内容输出xmlXML数据输出app_path当前应用目录base_path应用基础目录config_path应用配置目录public_pathweb根目录root_path应用根目录runtime_path应用运行时目录可以在应用的公共函数文件中重写上面这些助手函数。搜索器的特殊用法控制器层public function deviceList() { $keywords = $this->request->param('keywords', ''); $status = $this->request->param('status', null); $list = deviceModel::withSearch(['keywords', 'status'], [ 'keywords' => $keywords, 'status' => $status, ])->where('is_delete', 0)->order('sort desc,id desc')->paginate($this->limit); return json(success($list)); } model 层定义 public function searchKeywordsAttr($query, $value){ if ($value != '') { $map1 = [ ['name', '=', $value], ]; $map2 = [ ['code', '=', $value], ]; $query->whereOr([ $map1, $map2 ]); } } sql 语句SELECT * FROM `equ_list` WHERE ( `name` = '设备8' ) OR ( `code` = '设备8' ) AND `status` = 1 AND `is_delete` = 0 ORDER BY `sort` DESC,`id` DESC LIMIT 0,10 有问题的可以使用下列方法实现方法1: 适合用原生sql $query->whereRaw("`name`= '" . $value . "' or `code`= '" . $value . "' "); 方法2: $where[] = ['login_name|true_name', 'like', '%'.$keywords.'%']; $query->where($where) SELECT * FROM `equ_list` WHERE ( `name` LIKE '%设备8%' OR `code` LIKE '%设备8%' ) AND `status` = 0 AND `is_delete` = 0 ORDER BY `sort` DESC,`id` DESC LIMIT 0,10 前后端分离,反向代理前端nginx 不写死 后端接口地址,可以使用nginx代理来实现假设 前端访问有个manage 目录 location /manage { proxy_pass http://localhost:80; # 你可以根据需要修改这个值 proxy_set_header Host t.xxx.com; # 设置目标主机名 proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } tp6 启动workerman安装 Workermancomposer require topthink/think-worker 启动php think worker:server 停止可以使用:Press Ctrl+C to stop启动守护进程php think worker:server -d 停止守护进程php think stop 如果在Linux下面,同样支持reload|restart|stop|status 操作php think worker:server reload 如果需要自定义参数,可以在config/worker_server.php中进行配置,包括:配置参数描述protocol协议host监听地址port监听端口socket完整的socket地址并且支持workerman所有的参数(包括全局静态参数)。也支持使用闭包方式定义相关事件回调。配置文件两个配置文件worker 配置文件 // +---------------------------------------------------------------------- // +---------------------------------------------------------------------- // Workerman设置 仅对 php think worker:gateway 指令有效 // +---------------------------------------------------------------------- return [ // 扩展自身需要的配置 'protocol' => 'websocket', // 协议 支持 tcp udp unix http websocket text 'host' => '0.0.0.0', // 监听地址 'port' => 2348, // 监听端口 'socket' => '', // 完整监听地址 'context' => [], // socket 上下文选项 'register_deploy' => true, // 是否需要部署register 'businessWorker_deploy' => true, // 是否需要部署businessWorker 'gateway_deploy' => true, // 是否需要部署gateway // Register配置 'registerAddress' => '127.0.0.1:1236', // Gateway配置 'name' => 'thinkphp', 'count' => 1, 'lanIp' => '127.0.0.1', 'startPort' => 2000, 'daemonize' => false, 'pingInterval' => 30, 'pingNotResponseLimit' => 0, 'pingData' => '{"type":"ping"}', // BusinsessWorker配置 'businessWorker' => [ 'name' => 'BusinessWorker', 'count' => 1, 'eventHandler' => '\think\worker\Events', ], ]; worker_server配置文件 'thinkphp', 'count' => 4, 'onMessage' => function($connection, $data) { $connection->send(json_encode($data)); }, 'worker_class' => 'app\manage\http\Worker', // 自定义Workerman服务类名 支持数组定义多个服务*/ 'protocol' => 'websocket', // 协议 支持 tcp udp unix http websocket text 'host' => '0.0.0.0', // 监听地址 'port' => 2346, // 监听端口 'socket' => '', // 完整监听地址 'context' => [], // socket 上下文选项 'worker_class' => 'app\manage\http\Worker', // 自定义Workerman服务类名 支持数组定义多个服务 ]; worker 类getFile("D:/file"); var_dump($file); } public function onConnect(TcpConnection $tcpConnection) { $work = new \Workerman\Worker(); echo $tcpConnection->id . '\n'; echo $tcpConnection->getLocalIp() . '\n'; } public function onMessage(TcpConnection $connection, $data) { try { $res_arr = []; echo $data; Log::info('====同步原始数据==='); Log::info($data); $dataJson = json_decode($data, true); $arr_data = []; if (is_array($dataJson)){ if ($dataJson['code'] == 200) { $data = $dataJson['data']; $txt = $data['txt']; $upload = $data['upload']; $type = $data['type']; switch ($type) { case 'sfz': if (!empty($txt)) { $txt_arr = explode(',', $txt); if (is_array($txt_arr)) { $arr_data['name'] = trim($txt_arr[0]); $arr_data['sex'] = trim($txt_arr[1]); $arr_data['nation'] = trim($txt_arr[2]); $arr_data['birthday'] = trim($txt_arr[3]); $arr_data['address'] = trim($txt_arr[4]); $arr_data['cardid'] = trim($txt_arr[5]); $arr_data['issuing'] = trim($txt_arr[6]); $arr_data['validperiod'] = trim($txt_arr[7]); } else { $arr_data['name'] = ''; $arr_data['cardid'] = ''; } } break; case 'xxx': break; default: } $arr_data['type'] = $type; $arr_data['upload'] = $upload; if (empty($arr_data['name'])) { $res_arr['code'] = 201; $res_arr['msg'] = 'error'; $res_arr['data'] = '姓名不能为空'; } else { $res_arr['code'] = 200; $res_arr['msg'] = 'success'; $res_arr['data'] = $arr_data; } } $connection->send(json_encode($res_arr)); }else{ $res_arr['code'] = 201; $res_arr['msg'] = '数据无法解析'; $res_arr['data'] = $data; $connection->send(json_encode($res_arr)); } //$connection->send($tmpData); } catch (\Exception $exception) { Log::error($exception->getMessage()); } } private function savaUser(array $arr) { if (is_array($arr)){ if (empty(trim($arr['cardid']))){ $res_arr['code'] = 201; $res_arr['msg'] = 'error'; $res_arr['data'] = '身份证号码不能为空'; return json_encode($res_arr); } } } // 向所有验证的用户推送数据 function broadcast($message) { //遍历全局数组,然后发送数据 foreach ($this->worker->uidConnections as $connection) { $connection->send($message); } } // 针对uid推送数据 function sendMessageByUid($uid, $message) { echo '=====' . $uid . '===='; //指定key,然后取出对应的value,然后发送数据 if (isset($this->worker->uidConnections[$uid])) { $connection = $this->worker->uidConnections[$uid]; $connection->send($message); } } public function onClose(TcpConnection $tcpConnection) { echo '链接断开:\n'; } public function onWorkerStart($worker) { echo '========'; //查看是否有新的充值或提现订单,有就推送给所有用户 Timer::add(10, function () use ($worker) { /* $file = $this->getFile("D:/file"); foreach ($worker->connections as $connection) { $send['name'] = '系统信息'; $send['content'] = '这是一个定时任务信息'; $send['time'] = time(); $connection->send(json_encode($file)); }*/ }); } function onWorkerReload(Worker $worker) { foreach ($worker->connections as $connection) { $connection->send('worker reloading'); } } /** * 获取文件列表 * @param string $dir 绝对路径 */ public function getDir($dir) { $dirArray[] = NULL; if (false != ($handle = opendir($dir))) { $i = 0; while (false !== ($file = readdir($handle))) { //去掉"“.”、“..”以及带“.xxx”后缀的文件 if ($file != "." && $file != ".." && !strpos($file, '.')) { $dirArray[$i] = $file; $i++; } } //关闭句柄 closedir($handle); } return $this->writeJson($dirArray); //用JSON输出数组,不然直接rerun会报错 } //获取文件列表 public function getFile($dir) { $fileArray[] = NULL; if (false != ($handle = opendir($dir))) { $i = 0; while (false !== ($file = readdir($handle))) { if ($file != "." && $file != ".." && strpos($file, '.')) { $fileArray[$i]['url'] = $dir . '/' . $file; $fileArray[$i]['name'] = $file; if ($i == 100) { break; } $i++; } } closedir($handle); } return $this->writeJson($fileArray); } public function writeJson($file) { return json_encode($file); } } 获取绝对路径\think\facade\app::getRootPath() 根目录C:\www\tp6\ \think\facade\app::getAppPath() 应用路径 C:\www\tp6\app\index\ \think\facade\app::getConfigPath() 配置路径C:\www\tp6\config\ \think\facade\app::version() 核心版本 变量全局过滤 (用户请求)变量全局过滤你可以在app\Request.php 中设置filter全局过滤属性:class Request extends \think\Request { protected $filter = ["trim","htmlspecialchars","addslashes","strip_tags"]; } 效果演示令牌Token统一生成与验证生成令牌你可以在app\common.php 中添加生成令牌的方法:/** * 生成令牌 */ function shopToken() { $data = request()->buildToken('__token__', 'sha1'); return ''; } 在模板表单中使用:
{:shopToken()}
控制器验证namespace app\controller; use think\exception\ValidateException; use app\BaseController; class Index extends BaseController { public function index(Request $request) { $check = $this->request->checkToken('__token__', $this->request->param()); if (false === $check) { throw new ValidateException('invalid token'); } // ... } } JWT-实现token用户身份验证机制引入php-jwt包composer require firebase/php-jwt 生成token//生成token public function createJwt($userId = 'zq') { $key = md5('zq8876!@!'); //jwt的签发密钥,验证token的时候需要用到 $time = time(); //签发时间 $expire = $time + 14400; //过期时间 $token = array( "user_id" => $userId, "iss" => "http://www.najingquan.com/",//签发组织 "aud" => "zhangqi", //签发作者 "iat" => $time, "nbf" => $time, "exp" => $expire ); $jwt = JWTUtil::encode($token, $key); return $jwt; } 验证token//校验jwt权限API public function verifyJwt($jwt = '') { $key = md5('zq8876!@!'); try { $jwtAuth = json_encode(JWTUtil::decode($jwt, $key, array('HS256'))); $authInfo = json_decode($jwtAuth, true); $msg = []; if (!empty($authInfo['user_id'])) { $msg = [ 'status' => 1001, 'msg' => 'Token验证通过' ]; } else { $msg = [ 'status' => 1002, 'msg' => 'Token验证不通过,用户不存在' ]; } return $msg; } catch (\Firebase\JWT\ExpiredException $e) { echo json_encode([ 'status' => 1003, 'msg' => 'Token过期' ]); exit; } catch (\Exception $e) { echo json_encode([ 'status' => 1002, 'msg' => 'Token无效' ]); exit; } } 测试生成token验证token数据库常用查询与更新(搜集)use think\facade\Db; $rs =Db::name('user')->where('id',1)->find(); 查询一条记录 name不含前缀 $rs =Db::table('ims_user')->where('sex', 2)->select(); 多条数据 table含前缀 $rs1 =Db::name('user')->where('id', 1)->value('name'); 查询某个字段值 $rs =Db::table('ims_user')->where('sex', 2)->column('name,id','id'); 返回name,i d列,后面是key $userId = Db::name('user')->insertGetId($data);//插入数据返回id Db::name('user') ->limit(100) ->insertAll($data); 插入多条数据,分每次100 Db::name('user') ->where('id', 1) ->update(['name' => 'thinkphp']); 更新 Db::table('think_user')->delete(1); Db::table('think_user')->delete([1,2,3]); Db::table('think_user')->where('id',1)->delete(); Db::name('user')->delete(true);//清空数据 where('id',' >= like where("id=:id and username=:name", ['id' => 1 , 'name' => 'thinkphp']) field('id,title,content') 指定字段 limit(10,25) 第十条开始25条 单数字返回数据条数 page(1,10) 第一页十条 order(['id'=>'desc','sex'=>'desc']) 排序 group('user_id,test_time') 分组 count() max('id') min() avg() sum() 聚合函数 whereTime('birthday', '>=', '1970-10-1') 支持< = whereTime('create_time','-2 hours') 查询2小时 whereBetweenTime('create_time', '2017-01-01', '2017-06-30') 查询时间段 whereYear('create_time') 今年 whereYear('create_time','2018') last year 去年 whereMonth('create_time') last month上月 2018-06 具体月份 whereWeek('create_time') last week 上周 whereDay('create_time')今天 yesterday昨天 2018-11-1具体 Db::query("select * from think_user where status=1"); 原生查询 Db::execute("update think_user set name='thinkphp' where status=1");//更新插入删除 Db::query("select * from think_user where id=? AND status=?", [8, 1]);//绑定 $list = Db::name('user')->where('status',1)->paginate(10); 分页每页10条 tp6消息队列安装切换到WEB根目录下面并执行下面的命令:composer require topthink/think-queue 不要使用阿里云的composer镜像安装,使用阿里云的会出现各种的下载错误。包括安装ThinkPHP建议都不要使用阿里云的镜像。被坑多了。使用了阿里云的使用命令解除镜象再安装;composer config -g --unset repos.packagist 配置配置文件位于 config/queue.php使用redis作为消息队列return [ 'default' => 'redis', 'connections' => [ 'sync' => [ 'type' => 'sync', ], 'database' => [ 'type' => 'database', 'queue' => 'default', 'table' => 'jobs', 'connection' => null, ], 'redis' => [ 'type' => 'redis', 'queue' => 'default',//默认队列名称 'host' => '127.0.0.1',//Redis主机IP地址 'port' => 6379,//Redis端口 'password' => '',//Redis密码 'select' => 1,//Redis数据库 'timeout' => 0,//Redis连接超时时间 'persistent' => false,//是否长连接 ], ], 'failed' => [ 'type' => 'none', 'table' => 'failed_jobs', ], ]; 创建消费类在app目录下创建目录job,创建类文件test($job->attempts())){ // 删除队列 $job->delete(); }else{ // 判断执行失败次数,到达设置值后删除消息队列 if ($job->attempts() >= 10) { Log::channel('qxsp')->info('到达规定次数删除了'); // 删除队列 $job->delete(); }else{ Log::channel('qxsp')->info('继续执行'); // 重庆消息队列,重要:如果没有这样设置,默认的是1失败后1分钟执行一次,这样设置的话达到失败后隔多久执行下一次。官方的坑研究了好久。 $job->release(120); } } } // 处理业务逻辑 public function test($data) { Log::channel('qxsp')->info($data); return false; } } 创建任务类Queue::push($job, $data = '', $queue = null) 和Queue::later($delay, $job, $data = '', $queue = null) 两个方法,前者是立即执行,后者是在$delay秒后执行$job 是任务名命名空间是app\job的,比如上面的例子一,写Job1类名即可其他的需要些完整的类名,比如上面的例子二,需要写完整的类名app\lib\job\Job2如果一个任务类里有多个小任务的话,如上面的例子二,需要用@+方法名app\lib\job\Job2@task1、app\lib\job\Job2@task2$data 是你要传到任务里的参数$queue 队列名,指定这个任务是在哪个队列上执行,同下面监控队列的时候指定的队列名,可不填以下为上面消费类例子public function index() { Queue::push('Test', date("h:i:sa"), 'wu'); } 监听任务并执行在根目录下执行使用该语句:修改消费类代码可以实时更新无需重启php think queue:listen 使用该语句:修改消费类代码不会实时更新,需要重启才能生效php think queue:work 关联模型,hasOne的使用如果要关联多个hasOne,不能这样使用,这样会导致部分hasOne失效 AdmUser::with('role')->with(,'office')->with('department')->where('is_delete', 0)->paginate(); 正确的用法把它放到数组里 AdmUser::with(['role','office','department'])->where('is_delete', 0)->paginate(); 模型使用方法 public function role(){ return $this->hasOne('AdmRole', 'id','role_id'); } public function department(){ return $this->hasOne('Category', 'id','dept_id'); } public function office(){ return $this->hasOne('Office', 'id','office_id'); } 这样出来的是二维数组如何想变成1维数组,可以使用bind public function role(){ return $this->hasOne('AdmRole', 'id','role_id'); } public function department(){ return $this->hasOne('Category', 'id','dept_id')->bind(['dept_name'=>'name']); } public function office(){ return $this->hasOne('Office', 'id','office_id')->bind(['office_name'=>'name']); } 注意:[‘dept_name’=>‘name’][‘别名’=>‘字段名’]效果如下给自定义类加门面 现在app下建 facade文件夹. 绑定类路径 where('is_delete',0); } 注意点: 如何该字段有下划线 例如:is_delete 不能 scopeIsDelete 而是要 scopeIs_delete 可能是tp6系统小bug这样在查询的时候就不需要每次加上AdmUser::where('status',0)->select(); SELECT * FROM `adm_user` WHERE `status` = 0 AND `is_delete` = 0 LIMIT 0,10 消息队列消息操作请移步 thinkphp6 基于redis 的消息队列 queue实现sql 语句的 xxx and (xxx or xxx)QeueuOrder::whereRaw("`admin_uid` is null or `admin_uid` = ''")->where('office_id',3); 结果:SELECT * FROM `queue_order` WHERE ( `admin_uid` is null or `admin_uid` = '' ) AND `office_id` = 3 nginx 反向代理无效,页面出现404伪静态惹的祸,详细教程请看nginx忽略插入时数据库不存在的字段 strict(false) $res = \app\model\SysTemplate::strict(false)->insert($param); 如何给浏览器header 返回头加信息 public function response(){ header('Xxx:000000000000000000000000000000000000000000000'); return 1; } 结果:如何给浏览器加cookie public function response(){ response()->cookie('eee','eee'); return 1; } 结果:}

我要回帖

更多关于 获取url的参数有哪些方法 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信