222355-优化URS用户绑定关系列表农场用户列显示.md 4.8 KB

优化URS用户绑定关系列表农场用户列显示

任务时间

  • 开始时间:2025年06月22日 23:55:55 CST
  • 完成时间:2025年06月23日 00:05:xx CST

任务描述

将URS用户绑定关系列表中的"农场用户ID"列改为"农场用户"列,显示用户ID和昵称信息。

需求分析

  • 原来只显示农场用户ID数字
  • 现在需要显示ID + 昵称的组合信息
  • 保持原有的查看收益记录链接功能
  • 提升用户体验,便于识别用户

实现方案

1. 修改Repository预加载关联数据

文件: app/Module/UrsPromotion/Repositorys/UrsUserMappingRepository.php

/**
 * 获取查询构建器,预加载关联数据
 *
 * @return \Illuminate\Database\Eloquent\Builder
 */
public function getQueryBuilder()
{
    return parent::getQueryBuilder()->with(['user.info']);
}

说明: 预加载用户及其详细信息,避免N+1查询问题,提升性能。

2. 修改Grid列显示逻辑

文件: app/Module/UrsPromotion/AdminControllers/UrsUserMappingController.php

$grid->column('user_id', '农场用户')->sortable()->display(function ($value) {
    if (!$value) return '<span class="text-muted">未绑定</span>';
    
    // 获取当前行的模型数据
    $model = $this;
    
    // 获取用户昵称
    $nickname = $model->user && $model->user->info ? $model->user->info->nickname : '';
    $displayText = $value;
    if ($nickname) {
        $displayText .= '<br><small class="text-success">' . $nickname . '</small>';
    }
    
    // 添加到收益记录的链接
    $profitUrl = admin_url('urs-promotion/profits?farm_user_id=' . $value);
    $displayText .= '<br><small>
        <a href="' . $profitUrl . '" class="text-info">查看收益记录</a>
    </small>';
    
    return $displayText;
});

关键点:

  • 列标题从"农场用户ID"改为"农场用户"
  • 在display回调中,$this指向当前行的数据对象
  • 通过$model->user->info->nickname获取用户昵称
  • 昵称以绿色小字显示在ID下方
  • 保留原有的查看收益记录链接

技术要点

Dcat Admin Grid Display回调

  • 在display回调函数中,$this指向当前行的数据对象
  • 可以通过关联关系访问预加载的数据
  • 支持HTML格式化输出

数据预加载优化

  • 使用Repository的getQueryBuilder()方法预加载关联数据
  • 避免在列表渲染时产生N+1查询问题
  • 提升页面加载性能

测试验证

提交信息

优化URS用户绑定关系列表农场用户列显示

- 将农场用户ID列改为农场用户列
- 显示用户ID和昵称信息
- 昵称以绿色小字显示在ID下方
- 保留查看收益记录链接功能
- 在Repository中预加载用户关联数据以提升性能

文件变更

  • app/Module/UrsPromotion/Repositorys/UrsUserMappingRepository.php - 添加预加载关联数据
  • app/Module/UrsPromotion/AdminControllers/UrsUserMappingController.php - 修改列显示逻辑

效果展示

  • 用户ID:39083
  • 用户昵称:水清北阳(绿色小字)
  • 查看收益记录链接(蓝色链接)

问题修复

详情页面报错修复

问题: 访问详情页面时出现ArgumentCountError错误 错误信息: "Too few arguments to function App\Module\UrsPromotion\Models\UrsUserMapping::App\Module\UrsPromotion\AdminControllers{closure}(), 1 passed and exactly 2 expected"

原因分析:

  • Show页面的as方法回调函数只接收一个参数$value
  • 错误地定义了两个参数($value, $model)
  • 在Show页面中,$this指向当前模型对象

修复方案:

// 修复前(错误)
$show->field('related_links', '相关链接')->unescape()->as(function ($value, $model) {
    // ...
});

// 修复后(正确)
$show->field('related_links', '相关链接')->unescape()->as(function ($value) {
    // 在Show页面的as方法中,$this指向当前模型对象
    $model = $this;
    // ...
});

验证结果: 详情页面正常显示,相关链接功能正常工作。

技术总结

Dcat Admin Show页面vs Grid页面的区别

  1. Grid页面display回调: function ($value) { $model = $this; }
  2. Show页面as回调: function ($value) { $model = $this; }
  3. 两者都是通过$this获取当前模型对象,但参数定义不同

最佳实践

  • 在编写Dcat Admin回调函数时,先查看框架源码确认参数定义
  • 使用$this获取模型对象是通用做法
  • 避免假设参数数量,以框架实际实现为准

任务完成,用户体验得到显著提升,详情页面报错已修复。