|  | @@ -0,0 +1,145 @@
 | 
	
		
			
				|  |  | +<?php
 | 
	
		
			
				|  |  | +# 关系类
 | 
	
		
			
				|  |  | +namespace Invite\Lib;
 | 
	
		
			
				|  |  | +use Dever;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +class Relation
 | 
	
		
			
				|  |  | +{
 | 
	
		
			
				|  |  | +    private $table = 'invite/relation';
 | 
	
		
			
				|  |  | +    public function __construct($invite = '')
 | 
	
		
			
				|  |  | +    {
 | 
	
		
			
				|  |  | +        if ($invite) {
 | 
	
		
			
				|  |  | +            $this->table = $invite;
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    # 只记录3级关系
 | 
	
		
			
				|  |  | +    private $total = 3;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    # 通用的邀请方法:
 | 
	
		
			
				|  |  | +    # uid 当前用户的上级,需要通过code邀请码来得到
 | 
	
		
			
				|  |  | +    # to_uid 被邀请人,当前登录用户,注册后得到
 | 
	
		
			
				|  |  | +    public function set($uid, $to_uid)
 | 
	
		
			
				|  |  | +    {
 | 
	
		
			
				|  |  | +        $this->setParent($uid, $to_uid);
 | 
	
		
			
				|  |  | +        $this->add($uid, $to_uid, 1);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        return true;
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    public function setParent($uid, $to_uid, $level = 1)
 | 
	
		
			
				|  |  | +    {
 | 
	
		
			
				|  |  | +        $parent = $this->getParent($uid);
 | 
	
		
			
				|  |  | +        if ($parent) {
 | 
	
		
			
				|  |  | +            $level = $level + 1;
 | 
	
		
			
				|  |  | +            if ($level > $this->total) {
 | 
	
		
			
				|  |  | +                return;
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +            $this->add($parent['uid'], $to_uid, $level);
 | 
	
		
			
				|  |  | +            $this->setParent($parent['uid'], $to_uid, $level);
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    # 更换上级
 | 
	
		
			
				|  |  | +    public function replaceParent($uid, $old_parent, $new_parent, $call = true)
 | 
	
		
			
				|  |  | +    {
 | 
	
		
			
				|  |  | +        $info = Dever::db($this->table)->find(array('to_uid' => $uid, 'uid' => $old_parent));
 | 
	
		
			
				|  |  | +        if ($info) {
 | 
	
		
			
				|  |  | +            $state = Dever::db($this->table)->update($info['id'], array('uid' => $new_parent));
 | 
	
		
			
				|  |  | +            if ($state && $call) {
 | 
	
		
			
				|  |  | +                $child = $this->getChild($uid, false, false);
 | 
	
		
			
				|  |  | +                if ($child) {
 | 
	
		
			
				|  |  | +                    foreach ($child as $k => $v) {
 | 
	
		
			
				|  |  | +                        $this->replaceParent($v['to_uid'], $old_parent, $new_parent, false);
 | 
	
		
			
				|  |  | +                    }
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        return true;
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    # 重置上级
 | 
	
		
			
				|  |  | +    public function resetParent($uid, $parent)
 | 
	
		
			
				|  |  | +    {
 | 
	
		
			
				|  |  | +        Dever::db($this->table)->delete(array('to_uid' => $uid));
 | 
	
		
			
				|  |  | +        $this->set($parent, $uid);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        $child = $this->getChild($uid, 1, false);
 | 
	
		
			
				|  |  | +        if ($child) {
 | 
	
		
			
				|  |  | +            foreach ($child as $k => $v) {
 | 
	
		
			
				|  |  | +                $this->resetParent($v['to_uid'], $uid);
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        return true;
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    # 清理邀请关系
 | 
	
		
			
				|  |  | +    public function dropParent($uid, $parent)
 | 
	
		
			
				|  |  | +    {
 | 
	
		
			
				|  |  | +        return Dever::db($this->table)->delete(array('to_uid' => $uid, 'uid' => $parent));
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    # 获取某个用户的上级数据
 | 
	
		
			
				|  |  | +    public function getParent($uid, $level = 1)
 | 
	
		
			
				|  |  | +    {
 | 
	
		
			
				|  |  | +        return Dever::db($this->table)->find(array('to_uid' => $uid, 'level' => $level));
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    # 获取某个用户的所有上级数据
 | 
	
		
			
				|  |  | +    public function getParentAll($uid, $level = false)
 | 
	
		
			
				|  |  | +    {
 | 
	
		
			
				|  |  | +        $where['to_uid'] = $uid;
 | 
	
		
			
				|  |  | +        if ($level) {
 | 
	
		
			
				|  |  | +            $where['level'] = $level;
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        return Dever::db($this->table)->select($where);
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    # 获取某个用户的下级数据
 | 
	
		
			
				|  |  | +    public function getChild($uid, $level = false, $page = true)
 | 
	
		
			
				|  |  | +    {
 | 
	
		
			
				|  |  | +        $where['uid'] = $uid;
 | 
	
		
			
				|  |  | +        if ($level) {
 | 
	
		
			
				|  |  | +            $where['level'] = $level;
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        $set = array();
 | 
	
		
			
				|  |  | +        if ($page) {
 | 
	
		
			
				|  |  | +            $set['num'] = $page;
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        return Dever::db($this->table)->select($where, $set);
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    # 获取某个用户在x小时之内的下级数据
 | 
	
		
			
				|  |  | +    public function getChildNum($uid, $level = 1, $start = false, $end = false, $method = 'count')
 | 
	
		
			
				|  |  | +    {
 | 
	
		
			
				|  |  | +        $where['uid'] = $uid;
 | 
	
		
			
				|  |  | +        if ($level) {
 | 
	
		
			
				|  |  | +            $where['level'] = $level;
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        if ($start) {
 | 
	
		
			
				|  |  | +            $where['cdate#'] = array('>=', strtotime($start));
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        if ($end) {
 | 
	
		
			
				|  |  | +            $where['cdate##'] = array('<=', strtotime($end));
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        $method = 'select';
 | 
	
		
			
				|  |  | +        if ($method == 'count') {
 | 
	
		
			
				|  |  | +            $method = 'count';
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        return Dever::db($this->table)->$method($where);
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    # 插入数据
 | 
	
		
			
				|  |  | +    public function add($uid, $to_uid, $level = 1)
 | 
	
		
			
				|  |  | +    {   
 | 
	
		
			
				|  |  | +        $data['uid'] = $uid;
 | 
	
		
			
				|  |  | +        $data['to_uid'] = $to_uid;
 | 
	
		
			
				|  |  | +        $data['level'] = $level;
 | 
	
		
			
				|  |  | +        $info = Dever::db($this->table)->find($data);
 | 
	
		
			
				|  |  | +        if (!$info) {
 | 
	
		
			
				|  |  | +            return Dever::db($this->table)->insert($data);
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        
 | 
	
		
			
				|  |  | +        return false;
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +}
 |