212220-修复后台作物管理页面报错.md 3.6 KB

修复后台作物管理页面报错

任务信息

  • 时间: 2025-06-21 22:20
  • 任务: 修复后台 /admin/farm-crops 页面报错
  • 状态: ✅ 已完成

问题描述

后台作物管理页面 /admin/farm-crops 访问时出现 TypeError 错误:

TypeError: "Dcat\Admin\Grid\Filter\Where::__construct(): Argument #2 ($query) must be of type Closure, string given, called in /var/www/html/vendor/dcat/laravel-admin/src/Grid/Filter.php on line 789"

问题分析

错误发生在 FarmCropController.php 第139行,问题是 $filter->where() 方法的参数顺序不正确。

错误代码

$filter->where('final_output_amount', '产量状态', function ($query) {
    // 查询逻辑
})->select([...]);

正确语法

根据 Dcat Admin 文档,where 方法的正确参数顺序应该是:

$filter->where($column, \Closure $callback, $label = '')

解决方案

修改 app/Module/Farm/AdminControllers/FarmCropController.php 文件中的两个 where 过滤器:

修复前

$filter->where('final_output_amount', '产量状态', function ($query) {
    // ...
}, '产量状态')->select([...]);

$filter->where('data_completeness', '数据完整性', function ($query) {
    // ...
}, '数据完整性')->select([...]);

修复后

$filter->where('output_status', function ($query) {
    $value = $this->input;
    if ($value == 'has_amount') {
        $query->whereNotNull('final_output_amount');
    } elseif ($value == 'no_amount') {
        $query->whereNull('final_output_amount');
    }
}, '产量状态')->select([
    'has_amount' => '已确定产量',
    'no_amount' => '未确定产量'
]);

$filter->where('data_completeness', function ($query) {
    $value = $this->input;
    if ($value == 'complete') {
        $query->whereNotNull('final_output_item_id')
              ->whereNotNull('final_output_amount')
              ->where('growth_stage', GROWTH_STAGE::MATURE->value);
    } elseif ($value == 'incomplete_mature') {
        $query->where('growth_stage', GROWTH_STAGE::MATURE->value)
              ->where(function ($q) {
                  $q->whereNull('final_output_item_id')
                    ->orWhereNull('final_output_amount');
              });
    } elseif ($value == 'missing_amount') {
        $query->whereNotNull('final_output_item_id')
              ->whereNull('final_output_amount');
    }
}, '数据完整性')->select([
    'complete' => '数据完整(成熟期)',
    'incomplete_mature' => '数据不完整(成熟期)',
    'missing_amount' => '缺少产量'
]);

修改内容

  1. where 方法的参数顺序从 (field, label, callback) 改为正确的 (field, callback, label)
  2. 为第一个过滤器使用虚拟字段名 output_status,为第二个过滤器使用 data_completeness

测试结果

✅ 页面可以正常加载,不再出现 TypeError 错误 ✅ 筛选器正常显示,包含"产量状态"和"数据完整性"选项 ✅ 筛选功能正常工作,可以按"未确定产量"进行筛选 ✅ 筛选结果正确,只显示符合条件的记录 ✅ URL 参数正确传递(output_status=no_amount

提交信息

  • Commit: 3439d267
  • Message: 修复后台作物管理页面报错
  • Files: app/Module/Farm/AdminControllers/FarmCropController.php

技术要点

  1. Dcat Admin Where 过滤器语法where($column, \Closure $callback, $label = '')
  2. 参数顺序重要性:框架严格检查参数类型,顺序错误会导致 TypeError
  3. 虚拟字段名:可以使用不存在的字段名作为过滤器标识符
  4. 闭包上下文:在闭包中通过 $this->input 获取用户输入值