这是一个 PHP 运行时错误(Error),具体原因是代码试图访问一个不存在的数组键名。
简单来说:程序在 AgentLevelTaskServices.php 文件的第 396 行,尝试读取 $_POST 或 $_GET 参数中的 grade 字段,但这个字段并没有被传递过来,导致程序报错中断。
错误核心解析
- 错误类型:Undefined array key "grade"(未定义的数组键“grade”)
- 错误文件:app/services/spread/AgentLevelTaskServices.php
- 错误行号:396
错误定位
在 checkTypeTask 方法的第 396 行(根据您提供的错误堆栈),问题出在这个循环中:
// 第 391-400 行左右
$taskList = $this->dao->getTypTaskList($data['type']);
if ($taskList) {
foreach ($taskList as $taskInfo) {
if (is_null($taskInfo['grade'])) continue; // ← 这里访问了 'grade'
if ($levelInfo['grade'] > $taskInfo['grade'] && $data['number'] <= $taskInfo['number']) {
throw new ValidateException('不能小于低等级同类型任务限定数量');
}
if ($levelInfo['grade'] < $taskInfo['grade'] && $data['number'] >= $taskInfo['number']) {
throw new ValidateException('不能大于高等级同类型任务限定数量');
}
}
}问题:$taskInfo 数组中没有 grade 这个键,但代码直接访问了 $taskInfo['grade']。
解决方案
修改 Dao,使用 append 或手动处理(推荐)
修改 app/dao/spread/AgentLevelTaskDao.php 的 getTypTaskList 方法:
/**
* 获得所有同类型任务
* @param int $type
* @return array
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\DbException
* @throws \think\db\exception\ModelNotFoundException
*/
public function getTypTaskList(int $type)
{
$list = $this->getModel()
->with(['level' => function ($query) {
$query->field('id,grade')->where('status', 1)->where('is_del', 0);
}])
->where('type', $type)
->where('is_del', 0)
->where('status', 1)
->order('number desc')
->select()
->toArray();
// 手动将关联的 grade 提取到顶层
foreach ($list as &$item) {
$item['grade'] = $item['level']['grade'] ?? null;
unset($item['level']); // 可选:移除关联数组
}
return $list;
}
