php 如何生成path及其日常维护
php 如何生成path及其日常维护
path字段重要性不言而喻,在查询的时候,如果只用pid,查询效率会很低,增加path,查询效率大大提高,最起码不用递归查库了,重点是维护推荐关系的时候要维护path以及更改。
在path分隔符中,建议使用英文','号,方便查询。切记使用like,最好是使用find_in_set
一、path字段
1、首先是在会员表中,得有path字段,一些情况下,path字段会比较长,建议类型为text,不建议varchar
2、当推荐新会员的时候,借助父级的path,后面拼接上父级的id,就是新会员的path
$path = $path ? $pid . ',' . $path : $pid;
二、后台修改推荐人
这种情况是比较麻烦的,就是后台想更改某会员的父级,如果单纯的只有pid,只更改pid就行了,但是存在path,更改当前会员pid和path的同时,当前会员所有团队成员的path也得更改。
这里存在当前会员之前有上级和之前没有上级两种情况
1、已有上级,这时候所有团队成员的path为当前会员新path再拼接上当前会员的id,再拼接上下级之前的path中截取当前用户id之后的部分
2、没有上级,那所有团队成员的新path就简单了,直接为当前会员新path,直接拼接上下级的path即可
if ($params['pid'] && $params['pid'] != $row['pid']) {
//说明选择了新上级,而且确实和之前上级不一样了,如果新上级和之前上级一样,无需更新path
//首先验证pid不在目标子串中
$arr = explode(',',$puser['path']);
if ($arr && in_array($ids,$arr)) {
$this->error('自己下级不能成为新上级');
}
//更新当前会员自己的pid和path,
$params['path'] = $puser['path'] ? $puser['path'] . ',' . $params['pid'] : $params['pid'];
if ($row['pid']) {
//说明当前会员之前就有上级,
//则所有下级的新path为$params['path'] 再拼接上当前会员的id,再拼接上下级之前的path中截取当前用户id之后的部分
$sql = "update sn_user set path = (CONCAT('".$params['path']."',',',".$ids.",SUBSTRING_INDEX(path,".$ids.",-1))) where FIND_IN_SET(".$ids.",path)";
} else {
//说明当前会员之前没有上级,那所有下级的新path就简单了,直接为$params['path'],直接拼接上下级的path即可
$sql = "update sn_user set path = (CONCAT('".$params['path']."',',',path)) where FIND_IN_SET(".$ids.",path)";
}
$this->model->query($sql);
} else {
unset($params['pid']);
}
三、在无path下如何增加path
这种情况一般发生在已有一些会员的情况下,如果会员不多,自己手动改就行,当然,如果会员量比较大的话,手动就费劲了,所以有时候写一个脚本也是挺管用的。
1、首先在会员表新增path字段,默认为空值,然后新建一个标识path_status,在会员量大的时候进行分段查询
2、借助脚本,更新path,这里写的了一个递归查询,如有更好的方法,欢迎留言交流!
/*
* 更新path字段
*/
public function update_path()
{
//更新所有的用户的path]
$users = Db::name('member')
->where([
'pid'=>['gt',0],
'path_status'=>0,
])
->field('id,pid,path')
->limit(100)->select();
$count = 0;
foreach ($users as $v) {
//计算path,修改path_status为1
$path = $this->get_path(0,$v['pid']);
//$path = '0-'.$path;//拼接上顶级0
Db::name('member')->where('id',$v['id'])->update(['path'=>$path,'path_status'=>1]);
$count++;
}
echo $count;die;
}
这里是获取path的方法:
/*
* 递归查库,获取上级pid
*/
public function get_path($path,$pid)
{
$path = $path ? $pid.'-'.$path : $pid;
$rid = Db::name('member')->where('id',$pid)->value('pid');
if ($rid) {
return self::get_path($path,$rid);
}
return $path;
}
如果对于path的实现,有更好的方法或思路,欢迎留言交流!
php 如何生成path及其日常维护的更多相关文章
- 2.Nginx日常维护技巧
Nginx日常维护技巧 Nginx配置正确性检查 nginx提供了配置文件调试功能,可以快速定义配置文件存在的问题.执行如下命令检测配置文件的正确性: [root@localhost 桌面]# whi ...
- MySQL Cluster 日常维护
在前面几篇文章已经详细介绍了MySQL Cluster的搭建,配置讲解.而且相信大家都掌握了基本用法.现在我们来看看Cluster的日常维护.熟悉日常维护,将有助于工作中更好的管理和使用Cluster ...
- 2.goldengate日常维护命令(转载)
goldengate日常维护命令 发表于 2013 年 7 月 4 日 由 Asysdba 1.查看进程状态 GGSCI (PONY) 2> info all 2.查看进程详细状态,有助于排错 ...
- db2日常维护
一. DB2日常维护操作 1.数据库的启动.停止.激活 db2 list active databases db2 active db 数据库名 db2start --启动 db2stop [forc ...
- svn服务配置和日常维护命令
Subversion独立服务和与apache整合服务. 一 .Svn独立服务安装 操作系统: Redhat Linux AS3 AS 4 ContOS AS 4 安装包获取: 下载[url]ht ...
- mha日常维护命令
mha日常维护命令 http://m.blog.chinaunix.net/uid-28437434-id-3959021.html?/13033.shtml 1.查看ssh登陆是否成功masterh ...
- MQ日常维护操作手册
假设队列管理器为QMgrName,以下所有使用QMgrName的地方您都可以替换成您维护的mq队列管理器名称. 一.MQ的启动与停止 用root用户启/停需要root用户包含在mqm组中. 1.MQ的 ...
- MongoDB之基本操作与日常维护
MongoDB基本操作 MongoDB的基本操作主要是对数据库.集合.文档的操作,包括创建数据库.删除数据库.插入文档.更改文档.删除文档.和查询文档. 操作 描述 show dbs 查看当前实例下的 ...
- SQL Server 日常维护经典应用
SQL Server日常维护常用的一些脚本整理. 1.sql server开启clr权限: GO RECONFIGURE GO ALTER DATABASE HWMESTC SET TRUSTWORT ...
随机推荐
- 「CF803C」 Maximal GCD
题目链接 戳我 \(Solution\) 令\(gcd\)为\(x\),那么我们将整个序列\(/x\),则序列的和就变成了\(\frac{n}{x}\),所以\(x\)必定为\(n\)的约数所以现在就 ...
- easyui datagrid的API
本文可以当做api来使用 动态编辑用到DOM解析的话参考 http://www.w3school.com.cn/xmldom/dom_htmlcollection.asp 使用方法(Usage Exa ...
- js第一次学习心得
最近开始接触js,用的是阮一峰的菜鸟教程,相对来说我觉得是比较通俗易懂的,用了很多很小的例子去讲每一个很小的细节,但对于我这种因为即将到来的团队作业做准备的,也没有办法将每个细节都理解的清楚,主要的把 ...
- VUE中让由全局变量添加生成的新数组不随全局变量的变化而变化
问题场景: const addOptions = { singleOrComplex, totalNum: this.smallTotalPrice, selectList: this.purchas ...
- Web存储机制—sessionStorage,localStorage使用方法
Web存储机制,在这里主要聊有关于Web Storage API提供的存储机制,通过该机制,浏览器可以安全地存储键值对,比使用cookie更加直观.接下来简单的了解如何使用这方面的技术. 基本概念 W ...
- VisualVM通过ssl远程连接JVM
VisualVM通过密码连接JVM实例如下 https://www.cnblogs.com/qq931399960/p/10960573.html 虽然设置了密码,但还是不够安全,只要获取到密码,在任 ...
- 8,聚类分析 fenxinhuag
1.K-Means聚类分析 2.系统聚类分析 样本间常用距离: 类间常用距离: 3.DBSCAN聚类分析
- [net]tcp和udp&socket
参考 TCP和UDP连接 关于传输层TCP.UDP协议可能我们平时遇见的会比较多,有人说TCP是安全的,UDP是不安全的,UDP传输比TCP快,那为什么呢,我们先从TCP的连接建立的过程开始分析,然后 ...
- 大数相乘 java
<pre name="code" class="java">package bigMultiply; import java.math.BigInt ...
- python - 注释说明
归类三种注释风格: 大段的自定义块状注释 """ #========================================= # FileName: upgra ...