190443-URS用户推荐关系表添加农场用户ID字段.md 5.3 KB

URS用户推荐关系表添加农场用户ID字段

创建时间: 2025年06月19日 04:43
完成时间: 2025年06月19日 05:00
任务类型: 数据库结构优化
关联模块: URS推广模块

任务概述

为URS用户推荐关系表(urs_promotion_user_referrals)添加农场用户ID字段,用于存储用户和推荐人的农场用户ID,提高查询效率并支持直接关联。

需求分析

原有设计问题

  • 推荐关系表只存储URS用户ID,需要通过映射表才能获取农场用户ID
  • 查询推荐关系时需要多表关联,影响性能
  • 无法直接通过农场用户ID查询推荐关系

解决方案

  • 添加user_id字段存储农场用户ID(可能为0)
  • 添加referrer_id字段存储推荐人的农场用户ID(可能为0)
  • 用户进入农场后自动更新这些字段
  • 支持批量更新和单个用户更新

实现内容

1. 数据库结构修改

添加字段

-- 添加用户农场ID字段
ALTER TABLE `kku_urs_promotion_user_referrals` 
ADD COLUMN `user_id` BIGINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '农场用户ID(可能为0)' AFTER `urs_referrer_id`;

-- 添加推荐人农场ID字段
ALTER TABLE `kku_urs_promotion_user_referrals` 
ADD COLUMN `referrer_id` BIGINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '推荐人的农场用户ID(可能为0)' AFTER `user_id`;

添加索引

-- 添加用户农场ID索引
ALTER TABLE `kku_urs_promotion_user_referrals`
ADD INDEX `idx_user_id` (`user_id`);

-- 添加推荐人农场ID索引
ALTER TABLE `kku_urs_promotion_user_referrals`
ADD INDEX `idx_referrer_id` (`referrer_id`);

-- 添加组合索引用于推荐关系查询
ALTER TABLE `kku_urs_promotion_user_referrals`
ADD INDEX `idx_user_referrer` (`user_id`, `referrer_id`);

2. 模型层修改

UrsUserReferral模型

  • 添加user_idreferrer_id字段到$fillable数组
  • 添加字段类型转换到$casts数组
  • 添加与农场用户的直接关联关系
  • 更新字段注释

UrsUserReferralDto

  • 添加userIdreferrerId属性
  • 更新fromModel方法处理新字段

3. 服务层修改

UrsReferralService

  • 添加batchUpdateFarmUserIds()方法:批量更新所有推荐关系的农场用户ID
  • 添加updateFarmUserIdForUser()方法:更新特定用户相关的推荐关系记录

UrsUserEnteredFarmListener

  • 在用户进入农场事件中添加推荐关系农场用户ID更新逻辑
  • 确保用户进入农场后自动更新相关推荐关系

4. 测试验证

创建测试命令

  • TestFarmUserIdUpdateCommand:测试农场用户ID更新功能
  • 支持创建测试数据
  • 测试批量更新和单个用户更新功能
  • 显示更新前后的数据对比

测试结果

=== 测试结果 ===
✅ 批量更新功能:成功更新 3 条推荐关系记录
✅ 单个用户更新功能:更新成功
✅ 数据完整性:所有推荐关系都正确更新了农场用户ID

技术特点

1. 数据一致性

  • 字段默认值为0,表示尚未绑定农场用户
  • 通过事务确保数据更新的原子性
  • 支持增量更新,不影响现有数据

2. 性能优化

  • 添加索引提高查询性能
  • 批量更新减少数据库操作次数
  • 避免多表关联查询

3. 向后兼容

  • 保留原有的URS用户ID字段和映射关系
  • 新字段为可选,不影响现有功能
  • 支持渐进式迁移

4. 自动化处理

  • 用户进入农场时自动更新推荐关系
  • 事件驱动的更新机制
  • 异常处理不影响主流程

使用示例

批量更新所有推荐关系

$result = UrsReferralService::batchUpdateFarmUserIds();
// 返回: ['success' => true, 'affected_rows' => 3, 'message' => '成功更新 3 条推荐关系记录']

更新特定用户的推荐关系

$success = UrsReferralService::updateFarmUserIdForUser(1001, 2001);
// 返回: true

直接查询农场用户的推荐关系

// 现在可以直接通过农场用户ID查询
$referrals = UrsUserReferral::where('user_id', 2001)->get();
$referrers = UrsUserReferral::where('referrer_id', 2001)->get();

文件清单

新增文件

  • app/Module/UrsPromotion/Database/add_farm_user_id_fields.sql - 数据库迁移脚本
  • app/Module/UrsPromotion/Commands/TestFarmUserIdUpdateCommand.php - 测试命令

修改文件

  • app/Module/UrsPromotion/Models/UrsUserReferral.php - 模型字段和关联关系
  • app/Module/UrsPromotion/Dtos/UrsUserReferralDto.php - DTO字段
  • app/Module/UrsPromotion/Services/UrsReferralService.php - 服务方法
  • app/Module/UrsPromotion/Listeners/UrsUserEnteredFarmListener.php - 事件监听器
  • app/Module/UrsPromotion/Providers/UrsPromotionServiceProvider.php - 服务提供者

总结

本次任务成功为URS用户推荐关系表添加了农场用户ID字段,实现了:

  1. 数据结构优化:添加了user_idreferrer_id字段,提高查询效率
  2. 自动化更新:用户进入农场时自动更新推荐关系中的农场用户ID
  3. 批量处理:支持批量更新所有推荐关系的农场用户ID
  4. 性能提升:添加索引优化查询性能,避免多表关联
  5. 向后兼容:保持现有功能不受影响,支持渐进式迁移

该功能为后续的推荐关系查询和处理提供了更高效的数据访问方式。