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 ...
随机推荐
- [JOI2012春季合宿]Constellation (凸包)
题意 题解 神仙结论题. 结论: 一个点集合法当且仅当其凸包上的两种颜色点分别连续. 证明: 必要性显然. 充分性: 考虑对于一个不同色三角形\(ABC\),不妨设点\(A\)为白点,点\(B,C\) ...
- PHP-过滤器-连接数据库-解析XML
PHP 过滤器 what? PHP 过滤器用于验证和过滤来自非安全来源的数据,比如用户的输入. 验证和过滤用户输入或自定义数据是任何 Web 应用程序的重要组成部分. 设计 PHP 的过滤器扩展的目的 ...
- 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 ...
- js 处理url参数,应用导航分类
1.先上图 2.代码 html <li><a href="javascript:void(0);" data-cid = "{$v['id']}&quo ...
- Java-JVM 栈帧(Stack Frame)
一.概述 栈帧位置 JVM 执行 Java 程序时需要装载各种数据到内存中,不同的数据存放在不同的内存区中(逻辑上),这些数据内存区称作运行时数据区(Run-Time Data Areas). 其中 ...
- smartbi的安装及使用
http://wiki.smartbi.com.cn/pages/viewpage.action?pageId=42011285
- Mybatis框架学习1:入门
一框架介绍 1.Mybatis介绍 MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google c ...
- python全栈开发第6天
作业一:1) 开启Linux系统前添加一块大小为15G的SCSI硬盘 2) 开启系统,右击桌面,打开终端 3) 为新加的硬盘分区,一个主分区大小为5G,剩余空间给扩展分区,在扩展分区上划分1个逻辑分区 ...
- RGB颜色透明度转换
100% — FF95% — F290% — E685% — D980% — CC75% — BF70% — B365% — A660% — 9955% — 8C50% — 8045% — 7340% ...
- JSTL核心标签库详解
<c:out>标签 标签用于输出一段文本到浏览器中. 属性名 是否支持EL 属性类型 属 性 描 述 value true Object 指定要输出的内容 escapeXml true B ...