<?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(['to_uid' => $uid, 'uid' => $old_parent]); if ($info) { $state = Dever::db($this->table)->update($info['id'], ['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(['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(['to_uid' => $uid, 'uid' => $parent]); } # 获取某个用户的上级数据 public function getParent($uid, $level = 1) { return Dever::db($this->table)->find(['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 = 1, $page = 10) { $where['uid'] = $uid; if ($level) { $where['level'] = $level; } $set = []; 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#'] = ['>=', strtotime($start)]; } if ($end) { $where['cdate##'] = ['<=', 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; } }