'json' ]; protected $fillable = [ 'name', 'sn', 'powered_by', 'type', 'model_sn', 'state', 'extends' ]; public function scopePoweredBy(Builder $query, string $factory): void { $query->whereHas('factory', fn ($query) => $query->where('key', $factory)); } protected function serializeDate(\DateTimeInterface $date){ return $date->format('Y-m-d H:i:s'); } public static function typeMap() { return [ self::TYPE_MONITOR => '监控设备', self::TYPE_SOIL => '土壤设备', // self::TYPE_WATER_QUALITY => '水质设备', self::TYPE_METEOROLOGICAL => '气象设备', self::TYPE_AIR => '通风设备', self::TYPE_ATOMIZING => '喷雾设备', self::TYPE_INSECT => '虫情监测', ]; } public static function stateMap(){ return [ self::STATE_DISABLED => '禁用', self::STATE_ONLINE => '在线', self::STATE_OFFLINE => '离线', self::STATE_FAULT => '故障', ]; } public function modes(){ return $this->belongsToMany(MonitorMode::class, MonitorDevice::class, 'device_id', 'monitor_id')->withPivot('fields'); } public function logs(): HasMany { return $this->hasMany(DeviceLog::class); } public function factory() { return $this->belongsTo(Keyword::class, 'powered_by'); } public function isTypeSoil(): bool { return $this->type === static::TYPE_SOIL; } public function isTypeMeteorological(): bool { return $this->type === static::TYPE_METEOROLOGICAL; } public function isTypeAir(): bool { return $this->type === static::TYPE_AIR; } }