Use abstract parent data objects with multiple child implementations:
abstract class RecordConfig extends Data{ public function __construct( public int $tracks, ) {}}class CdRecordConfig extends RecordConfig{ public function __construct( int $tracks, public int $bytes, ) { parent::__construct($tracks); }}class VinylRecordConfig extends RecordConfig{ public function __construct( int $tracks, public int $rpm, ) { parent::__construct($tracks); }}
Cast to an abstract data class:
class Record extends Model{ protected $casts = [ 'config' => RecordConfig::class, ];}