当前位置: 首页 > news >正文

wordpress 网站的占有2020十大热点事件

wordpress 网站的占有,2020十大热点事件,聊城经济技术开发区人才网,淘宝网站建设的目标是什么意思前言 先交代下背景,在一个项目中,有一个数据表有水平分表的需求。当时想找到一种方法,把对数据库的操作,写到一个模型里,通过去换模型属性中的table来达到代码不变操作的数据表变化的效果。 我们都知道,模型要想关联数据表的话&a…

前言

先交代下背景,在一个项目中,有一个数据表有水平分表的需求。当时想找到一种方法,把对数据库的操作,写到一个模型里,通过去换模型属性中的table来达到代码不变操作的数据表变化的效果。
我们都知道,模型要想关联数据表的话,有两中方式,第一种就是将模型名和数据表一致。这样模型就会默认关联到名字对应的数据表。第二种就是定义模型的 protected $table 来指定表明。
添加链接描述

模型初始化

ThinkPHP5内置了partition方法,可用于实现简单的分表。新增,修改,删除,查询单条数据时,用parition方法都可以轻松搞定,因为这些操作有一个共同的特点,就是能事先明确的知道,我要操作的是哪一条记录。但有一个需求,ThinkPHP5似乎没有解决,比如当一个大表,被拆分成若干个子表时,如何根据相关条件及排序获取分页数据。这种需求场景下,由于事先并不知道哪些数据会出现在第一页,哪些数据会出现在第二页,这些根据检索条件动态匹配的列表数据,该如何查询呢?

模型层
<?php
namespace app\common\model;
use think\Model;
class WalletLog extends Model
{protected $table = 'tb_walletlog';protected $pk = 'walletid';private function getRule(){return ['type' => 'mod', // 分表方式'num'  => 3     // 分表数量];}public function saveData($data, $user_id){return $this->partition(['user_id' => $user_id], "user_id", $this->getRule())->insert($data);}public function getAll($where, $field = "*", $user_id){return $this->partition(['user_id' => $user_id], "user_id", $this->getRule())->where($where)->field($field)->select();}//查询所有分割表public function getAll2(){return $this->partition('', '', $this->getRule())->select();}
}

分库分表查询分表与其他表关联查询 join 不好使用(各种sql 报错)估计不支持

解决方案:

插入使用分表操作,进行分割数据,查询使用普通联合/聚合查询

1、模型层调整 查询
namespace application\workflow\model;
use think\Model;
class Init_Model extends Model
{protected $pk = 'id';//初始化表名public function __construct($name = ''){if (!empty($name)) {$this->name = $name;}}
}

使用时:$model = new init_model(‘test’); //成功改变了数据表
$model->get(); //操作时二次走__construct成空白,还原成没有表名;
请问有内置方法动态改变表名吗,对于动态管理的东东很须要这个功能呀
前人栽树,后人挖坑,哎

2、 执行sql 查询(拼接表名称来实现查询)
select count(1) as total from .$tables['countSql']
3、Db模型函数查询

注意:不要使用任何 SQL 语句中会出现的关键字当表名、字段名,例如 order 等。会导致数据模型拼装 SQL 语句语法错误。

thinkphp5 看云文档 partition 方法用于是数据库水平分表
partition 方法用法如下:

// 用于写入
$data = ['user_id'   => 110,'user_name' => 'think'
];$rule = ['type' => 'mod', // 分表方式'num'  => 10     // 分表数量
];
Db::name('log')->partition(['user_id' => 110], "user_id", $rule)->insert($data);// 用于查询
Db::name('log')->partition(['user_id' => 110], "user_id", $rule)->where(['user_id' => 110])->select();
4、闭包用法:

每个union方法相当于一个独立的SELECT语句。MySQL通过创建并填充临时表的方式来执行union查询。除非确实要消除重复的行,否则建议使用union all。原因在于如果没有all这个关键词,MySQL会给临时表加上distinct选项,这会导致对整个临时表的数据做唯一性校验,这样做的消耗相当高。

Db::field('name')->table('think_user_0')->union('SELECT name FROM think_user_1')->union('SELECT name FROM think_user_2')->select();
//或者下面这种用法
Db::field('name')->table('think_user_0')->union(['SELECT name FROM think_user_1','SELECT name FROM think_user_2'])->select();
//支持UNION ALL 操作,例如:
Db::field('name')->table('think_user_0')->union(['SELECT name FROM think_user_1','SELECT name FROM think_user_2'],true)->select();
其他案例

应用ThinkPHP内置的分表算法处理百万级用户数据.(适合流水类记录表)

数据表:house_member_0house_member_1house_member_2house_member_3模型中//class MemberModel extends AdvModel {protected $partition = array('field'=>'username','type'=>'id','num'=>'4');public function getDao($data=array()) {$data = empty($data) ? $_POST : $data;$table = $this->getPartitionTableName($data);return $this->table($table);}}方法中class MemberAction extends BaseAction {public function login() {if($this->isPost()) {$this->validToken();$dao = D('Member')->getDao();$res = $dao->where('username = '.$_POST['username'])->find();// output 为自定义方法// $isAjax - bool$this->output(false);}$this->display();}}/**+----------------------------------------------------------* 得到分表的的数据表名+----------------------------------------------------------* @access public+----------------------------------------------------------* @param array $data 操作的数据+----------------------------------------------------------* @return string+----------------------------------------------------------*/public function getPartitionTableName($data=array()) {// 对数据表进行分区if(isset($data[$this->partition['field']])) {$field = $data[$this->partition['field']];switch($this->partition['type']) {case 'id':// 按照id范围分表$step = $this->partition['expr'];$seq = floor($field / $step)+1;break;case 'year':// 按照年份分表if(!is_numeric($field)) {$field = strtotime($field);}$seq = date('Y',$field)-$this->partition['expr']+1;break;case 'mod':// 按照id的模数分表$seq = ($field % $this->partition['num'])+1;break;case 'md5':// 按照md5的序列分表$seq = (ord(substr(md5($field),0,1)) % $this->partition['num'])+1;break;default :if(function_exists($this->partition['type'])) {// 支持指定函数哈希$fun = $this->partition['type'];$seq = (ord(substr($fun($field),0,1)) % $this->partition['num'])+1;}else{// 按照字段的首字母的值分表$seq = (ord($field{0}) % $this->partition['num'])+1;}}return $this->getTableName().'_'.$seq;}else{// 当设置的分表字段不在查询条件或者数据中//进行联合查询,必须设定 partition['num']$tableName = array();for($i=0;$i<$this->partition['num'];$i++)$tableName[] = 'SELECT * FROM '.$this->getTableName().'_'.$i;$tableName = '( '.implode(" UNION ",$tableName).') AS '.$this->name;return $tableName;}}

温馨提示:
其中 partition 方法指定要查询的分表,where 方法则是查询条件。
需要注意的是,分表可能会给应用带来更高的维护成本和查询复杂度,需要在实际开发中根据业务需要进行选择
复杂模型实现不了的业务逻辑只能用原生sql 来实现。(团队封装的模型基本够用,大数据项目也不会用轻量级框架)有更好的分表查询方法可以欢迎留言。用到那、学到哪!!!

其他文档

ThinkPHP中的分表使用

http://www.yayakq.cn/news/394451/

相关文章:

  • 合肥市建设网站市场信息价茶叶公司网站的建设
  • 响应式网站建设网站wordpress什么删留言
  • wordpress企业仿站小程序开发公司主页制作标准
  • 北京模板网站开发全包wordpress采集插件
  • 化妆品网站栏目策划如何用易语言做网站
  • 绵阳市建设工程质监站网站专业的设计网站建设
  • 天津网站开发建设wordpress DUX商店模式
  • 深圳市南山区粤海街道惠州百度seo排名
  • 视频网站cms系统青岛北京网站建设公司哪家好
  • 太湖县网站建设公司页面设计要怎么做
  • 建设农产品网络营销网站网站建设教程pdf
  • python 做网站开发吗扫码支付 wordpress
  • iis 如何新建网站盐田做网站
  • 网站建设技术公司html布局模板
  • 酒店网站模板生成关键词的软件免费
  • 做汤的网站有哪些linux 网站开发
  • 单位网站建设维护情况报告网页设计与制作课程性质
  • 做网站公司排名是什么西安软件开发公司
  • 天津教育学会网站建设免费的logo在线设计
  • 网站推广的心得wordpress教程 网站标题
  • 如何做更改网站的图片巩义公司做网站
  • 做网站有没有效果关于做网站的书籍
  • 兰州网站建设兰州供求网站建设
  • 营商环境建设局网站建立网站需要怎么做
  • 网站背景更换wordpress 腾讯
  • 达内培训网站开发修改wordpress主体字体
  • 搜索网站的软件有哪些做哪类网站没有版权问题
  • 网站设计与网页制作心得体会网络信息安全工程师
  • 家具公司网站模板下载wordpress是指什么系统
  • 寻乌建设局网站做神马网站优化快