php分销关系实现
分销关系实现方法
在PHP中实现分销关系通常涉及用户层级管理、佣金计算和数据存储。以下是几种常见的实现方式:
数据库设计
创建用户表时添加推荐关系字段:
CREATE TABLE users (
id INT PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(50),
parent_id INT DEFAULT NULL,
level INT DEFAULT 0,
FOREIGN KEY (parent_id) REFERENCES users(id)
);
递归查询上级
通过递归方式获取所有上级用户:
function getAncestors($userId, $conn) {
$ancestors = [];
$currentId = $userId;
while ($currentId != null) {
$stmt = $conn->prepare("SELECT id, parent_id FROM users WHERE id = ?");
$stmt->execute([$currentId]);
$user = $stmt->fetch();
if ($user && $user['parent_id']) {
$ancestors[] = $user['parent_id'];
$currentId = $user['parent_id'];
} else {
break;
}
}
return $ancestors;
}
多级佣金计算
根据层级关系计算不同级别的佣金:
function calculateCommission($orderAmount, $ancestors) {
$commissionRates = [
1 => 0.3, // 一级30%
2 => 0.2, // 二级20%
3 => 0.1 // 三级10%
];
$commissions = [];
foreach ($ancestors as $level => $userId) {
$currentLevel = $level + 1;
if (isset($commissionRates[$currentLevel])) {
$commissions[$userId] = $orderAmount * $commissionRates[$currentLevel];
}
}
return $commissions;
}
闭包表实现
对于更复杂的分销网络,可以使用闭包表存储所有祖先-后代关系:
CREATE TABLE user_relations (
ancestor_id INT,
descendant_id INT,
depth INT,
PRIMARY KEY (ancestor_id, descendant_id),
FOREIGN KEY (ancestor_id) REFERENCES users(id),
FOREIGN KEY (descendant_id) REFERENCES users(id)
);
分销关系维护
当新用户注册时自动建立关系:
function addUserRelation($userId, $parentId, $conn) {
// 插入直接父关系
$conn->prepare("INSERT INTO user_relations (ancestor_id, descendant_id, depth) VALUES (?, ?, 1)")
->execute([$parentId, $userId]);
// 插入所有上级关系
$stmt = $conn->prepare("
INSERT INTO user_relations (ancestor_id, descendant_id, depth)
SELECT ancestor_id, ?, depth + 1
FROM user_relations
WHERE descendant_id = ?
");
$stmt->execute([$userId, $parentId]);
}
性能优化建议
对于大型分销网络,考虑以下优化:
- 使用缓存存储用户关系
- 定期预计算佣金汇总
- 对分销关系表建立适当索引
- 考虑使用图数据库处理复杂网络关系
以上方法可以根据具体业务需求进行调整,如设置不同层级佣金比例、添加分销等级限制等。实现时需注意数据一致性和并发处理。







