old message controller:

	public function actionViewUpdate(int $id): Response|string
	{
		$model = $this->findModel($id);
		$replyForm = new ReplyForm($model->id);
		$request = \Yii::$app->request;
		
		if (($request->isPost) && ($replyForm->load($request->post()))) {
		
			// Check that Form status is not STATUS_REPLIED, this status should not be manually set via a form.
			$inputStatus = (int)$replyForm->status;
			if ($inputStatus !== Contact::STATUS_REPLIED) {
			
				 // Check that current model status is not STATUS_REPLIED and a reply hasn't been set.
				if (($model->status !== Contact::STATUS_REPLIED) && (ValueHelper::isSetAndNull($model->replied))) {
				
					// Determine if a reply has been provided via the form.
					$getReply = ValueHelper::isSetNotNull($replyForm->reply);
					
					// Check if the status has changed from the original model status.
					$getStatus = $replyForm->status !== $model->status;
					
					// Determine scenario based on form changes.
					if ($getReply && $getStatus) {
					
						$replyForm->scenario = 'both';
					}
					elseif ($getReply) {
					
						$replyForm->scenario = 'replyOnly';
					}
					elseif ($getStatus) {
					
						$replyForm->scenario = 'statusOnly';
					}
				}
				// Only status change is possible if replied is set.
				else {
					$replyForm->scenario = 'statusOnly';
				}
			}
			
			// Use the selected scenario to validate form and process.
			if ($replyForm->validate()) {
			
				// Double-check that STATUS_REPLIED is not being saved.
				if ($inputStatus !== Contact::STATUS_REPLIED) {
					
					if ($replyForm->process()) {
						
						$this->setScenarioSuccessFlash($replyForm->scenario, $model);
						
						return $this->redirect(['index']);
					}
					else {
						// Note: Error logging is handled within form Model(s) and user-facing error messages wthin the controller.
						$msg = \Yii::t('app', 'There was an error processing your request. Please try again.');
						\Yii::$app->session->setFlash('error', $msg);
					}
				}
				// If trying to save $status as STATUS_REPLIED, give error.
				else {
					$msg = \Yii::t('app', 'Cannot save status to replied.');
					\Yii::$app->session->setFlash('error', $msg);
				}
			}
			else {
				// Validation failed.
				$msg = \Yii::t('app', 'There was a validation error. Please check your input.');
				\Yii::$app->session->setFlash('error', $msg);
			}
		}
		
		// First time viewing Message, change status to Read.
		if (($request->isGet) && 
			($model->new_message == '1' && $model->status == Contact::STATUS_UNREAD)) {
			
			$model->new_message = '0';
			$model->status = Contact::STATUS_READ;
			$model->save(false);
		}
		
		return $this->render('view', [
			'model' => $model,
			'replyForm' => $replyForm,
		]);
	}

message view/update:

<div class="card admin-card">
<div class="card-header admin-card-header">
<h5 class="mb-0"><?= Html::encode($this->title) . ' (ID: ' . Html::encode($model->id) . ')'; ?></h5></div>
<div class="card-body admin-card-body">
<div class="form-container">

<div class="reply-form-status">
<?php
// Prepare status options for the form.
$currentStatus = $model->status;
// Define available options
$statusOptions = [
	Contact::STATUS_UNREAD => 'Unread',
	Contact::STATUS_READ => 'Read',
	Contact::STATUS_IMPORTANT => 'Important',
	Contact::STATUS_SPAM => 'Spam',
];

// Include STATUS_REPLIED in options only if it's the current status.
if ($currentStatus === Contact::STATUS_REPLIED) {
	$statusOptions[Contact::STATUS_REPLIED] = 'Replied';
}

echo $form->field($replyForm, 'status')->dropDownList($statusOptions, [
	'options' => [$currentStatus => ['Selected' => true]],
	'prompt' => \Yii::t('app', 'Select a status...'),
])->hint(\Yii::t('app', 'required'));
?>
</div><!-- .reply-form-status -->

<div class="card">
<div class="card-header">
<?php /*<h3 class="mt-0"><?= Html::encode($this->title); ?></h3>*/ ?>
<h6 class="font-italic"><?= \Yii::t('app', 'Sent on: ') . $formatter->asDatetime($model->created_at, 'medium'); ?></h6>
<h6><?= \Yii::t('app', 'Sent by: ') . Html::encode($model->email); ?></h6>
<?php $ip = ($model->created_ip) ? $model->created_ip : '(not set)'; ?>
<h6><?= \Yii::t('app', 'IP: ') . $ip; ?></h6>
<hr>
<h6><?= \Yii::t('app', 'Subject: ') . Html::encode($model->subject); ?></h6>
</div><!-- .cart-header -->

<div class="card-body m-3 p-0">
<?= Html::encode($model->body); ?>
</div><!-- .card-body .p-0 -->
</div><!-- .card -->


<?php if (ValueHelper::isSetAndNull($model->replied) && $model->status !== Contact::STATUS_REPLIED) : ?>
<div class="reply-form-reply mt-3 ms-3">
<?= $form->field($replyForm, 'reply')->textarea(['rows' => 6])->label('Send a reply:'); ?>
</div><!-- .reply-form-reply -->


<?php else : ?>


<div class="reply-form-reply mt-3 ms-3">
<div class="card">
<div class="card-header">
<h6 class="font-italic"><?= \Yii::t('app', 'Replied on: ') . $formatter->asDatetime($model->repliedTime, 'medium'); ?></h6>
</div><!-- .cart-header -->
<div class="card-body m-3 p-0">
<?= Html::encode($model->replied); ?>
</div><!-- .card-body .p-0 -->
</div><!-- .card -->
</div><!-- .reply-form-reply -->


<?php endif; ?>
</div><!-- .form-container -->
</div><!-- .card-body -->
</div><!-- .card -->


Im wanting to take my old message controller/model code and figure out the best way to use the suggestions you offered in 
calling replies like so:


message controller:

	public function actionViewUpdate(int $id): Response|string
	{
		// is my original option in calling replies...
		$message = $this->findModel($id);
		$replies = $message->getReplies()->all();// Get replies for the current message.
	}
	
message model:

	public function getReplies(): MessageQuery
	{
		return $this->hasMany(self::class, ['parent_id' => 'id']);
	}