为 app/Module/Farm/Models/FarmLand.php 模型增加 has_crop 字段,用于判断土地是否有作物。
kku_farm_land_users 表中添加 has_crop 字段根据土地状态判断是否有作物:
-- 添加has_crop字段
ALTER TABLE `kku_farm_land_users` ADD COLUMN `has_crop` tinyint(1) NOT NULL DEFAULT 0 COMMENT '是否有作物:0无,1有' AFTER `status`;
-- 根据现有数据更新字段值
UPDATE `kku_farm_land_users` SET `has_crop` = 1 WHERE `status` IN (1, 2, 3, 4);
/**
* field start
* @property int $id 主键ID
* @property int $user_id 用户ID
* @property int $position 土地位置(1-20)
* @property int $land_type 土地类型:1普通,2红土,3黑土,4金,5蓝,6紫
* @property int $status 土地状态:0空闲,1种植中,2灾害,3可收获,4枯萎
* @property bool $has_crop 是否有作物(种植中、灾害、可收获、枯萎状态都算有作物)
* @property \Carbon\Carbon $created_at 创建时间
* @property \Carbon\Carbon $updated_at 更新时间
* field end
*/
// 在$fillable中添加字段
protected $fillable = [
'user_id',
'position',
'land_type',
'status',
'has_crop', // 新增
];
// 添加类型转换
protected $casts = [
'has_crop' => 'boolean',
];
/**
* 更新has_crop字段值
* 根据当前状态自动更新has_crop字段
*
* @return void
*/
public function updateHasCrop(): void
{
$this->has_crop = in_array($this->status, [
LAND_STATUS::PLANTING->value, // 1 种植中
LAND_STATUS::DISASTER->value, // 2 灾害
LAND_STATUS::HARVESTABLE->value, // 3 可收获
LAND_STATUS::WITHERED->value, // 4 枯萎
]);
}
在所有修改土地状态的地方添加 $land->updateHasCrop() 调用:
CropLogic::sowSeed() - 种植时CropLogic::witherCrop() - 枯萎时CropLogic::clearDisaster() - 清理灾害时CropLogic::clearCrop() - 清理作物时CropLogic::updateCropGrowthStage() - 生长阶段更新时UpdateCropStatusListener::handle() - 状态监听器中// 在Grid中添加列显示
$grid->column('has_crop', '是否有作物')->display(function ($value) {
return $value ? '有作物' : '无作物';
});
// 在筛选器中添加筛选
$filter->equal('has_crop', '是否有作物')->select([0 => '无作物', 1 => '有作物']);
// 在表单中添加只读显示
$form->display('has_crop', '是否有作物')->with(function ($value) {
return $value ? '有作物' : '无作物';
});
// 在表单保存时自动更新
$form->saving(function (Form $form) {
$status = (int)$form->status;
$form->has_crop = in_array($status, [1, 2, 3, 4]) ? 1 : 0;
});
$farmLand = FarmLand::find(1);
$hasCrop = $farmLand->has_crop; // 返回 true/false
// 手动更新(通常不需要,系统会自动维护)
$farmLand->updateHasCrop();
$farmLand->save();
更新后的数据库状态:
808853f8 - 为FarmLand模型增加has_crop字段判断是否有作物cb02a807 - 完善FarmLand模型has_crop字段功能:添加数据库字段、数值维护和后台展示app/Module/Farm/Models/FarmLand.php:增加字段定义、类型转换和维护方法app/Module/Farm/AdminControllers/FarmLandController.php:增加后台展示和筛选功能app/Module/Farm/Listeners/UpdateCropStatusListener.php:增加字段维护逻辑app/Module/Farm/Logics/CropLogic.php:在多个方法中增加字段维护逻辑kku_farm_land_users 表增加 has_crop 字段✅ 数据库字段创建成功 ✅ 现有数据正确更新 ✅ 后台管理页面正确显示"有作物"/"无作物" ✅ 筛选功能正常工作 ✅ 表单显示功能正常 ✅ 自动维护逻辑已添加到所有相关位置
建议编写单元测试验证:
has_crop 字段的返回值