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及其日常维护的更多相关文章

  1. 2.Nginx日常维护技巧

    Nginx日常维护技巧 Nginx配置正确性检查 nginx提供了配置文件调试功能,可以快速定义配置文件存在的问题.执行如下命令检测配置文件的正确性: [root@localhost 桌面]# whi ...

  2. MySQL Cluster 日常维护

    在前面几篇文章已经详细介绍了MySQL Cluster的搭建,配置讲解.而且相信大家都掌握了基本用法.现在我们来看看Cluster的日常维护.熟悉日常维护,将有助于工作中更好的管理和使用Cluster ...

  3. 2.goldengate日常维护命令(转载)

    goldengate日常维护命令 发表于 2013 年 7 月 4 日 由 Asysdba 1.查看进程状态 GGSCI (PONY) 2> info all 2.查看进程详细状态,有助于排错 ...

  4. db2日常维护

    一. DB2日常维护操作 1.数据库的启动.停止.激活 db2 list active databases db2 active db 数据库名 db2start --启动 db2stop [forc ...

  5. svn服务配置和日常维护命令

    Subversion独立服务和与apache整合服务. 一 .Svn独立服务安装 操作系统: Redhat Linux AS3  AS 4   ContOS AS 4 安装包获取: 下载[url]ht ...

  6. mha日常维护命令

    mha日常维护命令 http://m.blog.chinaunix.net/uid-28437434-id-3959021.html?/13033.shtml 1.查看ssh登陆是否成功masterh ...

  7. MQ日常维护操作手册

    假设队列管理器为QMgrName,以下所有使用QMgrName的地方您都可以替换成您维护的mq队列管理器名称. 一.MQ的启动与停止 用root用户启/停需要root用户包含在mqm组中. 1.MQ的 ...

  8. MongoDB之基本操作与日常维护

    MongoDB基本操作 MongoDB的基本操作主要是对数据库.集合.文档的操作,包括创建数据库.删除数据库.插入文档.更改文档.删除文档.和查询文档. 操作 描述 show dbs 查看当前实例下的 ...

  9. SQL Server 日常维护经典应用

    SQL Server日常维护常用的一些脚本整理. 1.sql server开启clr权限: GO RECONFIGURE GO ALTER DATABASE HWMESTC SET TRUSTWORT ...

随机推荐

  1. [JOI2012春季合宿]Constellation (凸包)

    题意 题解 神仙结论题. 结论: 一个点集合法当且仅当其凸包上的两种颜色点分别连续. 证明: 必要性显然. 充分性: 考虑对于一个不同色三角形\(ABC\),不妨设点\(A\)为白点,点\(B,C\) ...

  2. PHP-过滤器-连接数据库-解析XML

    PHP 过滤器 what? PHP 过滤器用于验证和过滤来自非安全来源的数据,比如用户的输入. 验证和过滤用户输入或自定义数据是任何 Web 应用程序的重要组成部分. 设计 PHP 的过滤器扩展的目的 ...

  3. Hands-on ML and TF Chapter16 Reinforcement Learning

    Policy Granients import tensorflow as tf reset_graph() n_inputs = 4 n_hidden = 4 n_outputs = 1 learn ...

  4. js 处理url参数,应用导航分类

    1.先上图 2.代码 html <li><a href="javascript:void(0);" data-cid = "{$v['id']}&quo ...

  5. Java-JVM 栈帧(Stack Frame)

    一.概述 栈帧位置 JVM 执行 Java 程序时需要装载各种数据到内存中,不同的数据存放在不同的内存区中(逻辑上),这些数据内存区称作运行时数据区(Run-Time Data Areas). 其中 ...

  6. smartbi的安装及使用

    http://wiki.smartbi.com.cn/pages/viewpage.action?pageId=42011285

  7. Mybatis框架学习1:入门

    一框架介绍 1.Mybatis介绍 ​ MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google c ...

  8. python全栈开发第6天

    作业一:1) 开启Linux系统前添加一块大小为15G的SCSI硬盘 2) 开启系统,右击桌面,打开终端 3) 为新加的硬盘分区,一个主分区大小为5G,剩余空间给扩展分区,在扩展分区上划分1个逻辑分区 ...

  9. RGB颜色透明度转换

    100% — FF95% — F290% — E685% — D980% — CC75% — BF70% — B365% — A660% — 9955% — 8C50% — 8045% — 7340% ...

  10. JSTL核心标签库详解

    <c:out>标签 标签用于输出一段文本到浏览器中. 属性名 是否支持EL 属性类型 属 性 描 述 value true Object 指定要输出的内容 escapeXml true B ...