*/ public const VALID_REGISTRATION_TYPES = [ self::REG_LESSON, self::REG_ENROLLMENT, self::REG_ACCOUNT ]; public function __construct( public readonly int $questionId, public readonly string $registrationType, public readonly int $registrationId, public readonly int $studentId, public readonly ?string $answerValue = null, /** * How this answer reached the studio when it did not come from the booking * form — see {@see IntakeProvenance}. Null is the ordinary case: the student * typed it in themselves. */ public readonly ?string $collectedVia = null, public readonly ?string $collectedNote = null, /** The staff member who typed it in, when somebody did. */ public readonly int $recordedBy = 0, public readonly ?int $id = null, ) {} public static function fromRow( \stdClass $row ): self { return new self( questionId: Val::int( $row->question_id ), registrationType: Val::string( $row->registration_type ), registrationId: Val::int( $row->registration_id ), studentId: Val::int( $row->student_id ), answerValue: Val::stringOrNull( $row->answer_value ), collectedVia: Val::stringOrNull( $row->collected_via ?? null ), collectedNote: Val::stringOrNull( $row->collected_note ?? null ), recordedBy: Val::int( $row->recorded_by ?? 0 ), id: Val::int( $row->id ), ); } /** * Returns a plain array representation of the answer. * * @return array */ public function toArray(): array { return [ 'id' => $this->id, 'question_id' => $this->questionId, 'registration_type' => $this->registrationType, 'registration_id' => $this->registrationId, 'student_id' => $this->studentId, 'answer_value' => $this->answerValue, 'collected_via' => $this->collectedVia, 'collected_note' => $this->collectedNote, 'recorded_by' => $this->recordedBy, ]; } }