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. vue-property-decorator知识梳理

    仓库地址: /* npm 仓库地址 */ // https://www.npmjs.com/package/vue-property-decorator /* github地址 */ // https ...

  2. python-线性回归预测

    导入包 # Required Packages import matplotlib.pyplot as plt import numpy as np import pandas as pd from ...

  3. cocos2dx热更新之后,闪退问题记录。

    如果使用cocos2dx的3.17.2版本的官方热更新. 然后有玩家反馈说热更新之后游戏闪退,游戏内有部分资源没更到. 考虑如下几个方面调整. 1,在文件下载失败的时候,直接调用重新下载. 2,把下载 ...

  4. JS中的原型链和原型的认识

    这篇文章主要是学习一下JavaScript中的难点------原型和原型链 自定义一个对象 我们学习一门编程语言,必然要使用它完成一些特定的功能,而面向对象的语言因为符合人类的认知规律,在这方面做得很 ...

  5. linux安装vlc视频播放器

    文章来自转发 最近,打算在centos7.2上安装一个叫MPlayer的视频播放器,但是折腾好久,得到的结果只是可以播放,但是却没有声音.无奈之下另寻他路.最后选择安装VLC视频播放器. 我的linu ...

  6. SQLSTATE[HY000] [2002] Connection refused

    //域名绑定到模块 '__domain__' => [ 'admin' => 'admin', 'post' => 'api', 'user' => 'index', 'www ...

  7. koa 基础(十二)koa-static 静态资源中间件 静态web服务

    1.目录 2.app.js /** * koa-static 静态资源中间件 静态web服务 * 1.npm install --save koa-static * 2.const static = ...

  8. 转载:一文详解SQL解析与应用

    转载地址:http://www.elecfans.com/emb/20180618696111.html 数据库作为核心的基础组件,是需要重点保护的对象.任何一个线上的不慎操作,都有可能给数据库带来严 ...

  9. DP&图论 DAY 3 下午 考试

    Problem AProblem Description有一天 Tarzan 写了一篇文章,我们发现这文章当中一共出现了 n 个汉字,其中第 i 个汉字出现了 ai 次,因为 Tarzan 不希望文章 ...

  10. 使用谷歌提供的SwipeRefreshLayout下拉控件,并自定义实现下拉加载的功能

    package com.loaderman.swiperefreshdemo; import android.os.Bundle; import android.os.Handler; import ...