Files
alrahma_sunday_school/app/Models/SubjectCurriculumModel.php
root 5f27dccd0f
Tests / PHPUnit (push) Failing after 1m15s
fix parent and teacher pages to follow year filter
2026-07-15 20:03:36 -04:00

111 lines
3.0 KiB
PHP

<?php
namespace App\Models;
use CodeIgniter\Model;
class SubjectCurriculumModel extends Model
{
protected $table = 'subject_curriculum_items';
protected $primaryKey = 'id';
protected $allowedFields = [
'class_id',
'subject',
'unit_number',
'unit_title',
'chapter_name',
'created_at',
'updated_at',
];
protected $returnType = 'array';
protected $useTimestamps = true;
protected $createdField = 'created_at';
protected $updatedField = 'updated_at';
public function getOptionsForClass(int $classId, string $subject): array
{
$rows = $this->orderedOptionsBuilder()
->where('subject_curriculum_items.class_id', $classId)
->where('subject_curriculum_items.subject', $subject)
->get()
->getResultArray();
if (! empty($rows)) {
return $rows;
}
$fallbackClassIds = $this->classIdsWithSameName($classId);
if (empty($fallbackClassIds)) {
return [];
}
$rows = $this->orderedOptionsBuilder()
->whereIn('subject_curriculum_items.class_id', $fallbackClassIds)
->where('subject_curriculum_items.subject', $subject)
->get()
->getResultArray();
return $this->uniqueCurriculumRows($rows);
}
private function orderedOptionsBuilder()
{
return $this->db->table($this->table)
->select('subject_curriculum_items.*')
->orderBy('unit_number', 'ASC')
->orderBy("CAST(SUBSTRING_INDEX(chapter_name, '.', 1) AS UNSIGNED)", 'ASC', false)
->orderBy('chapter_name', 'ASC')
->orderBy('id', 'ASC');
}
private function classIdsWithSameName(int $classId): array
{
$class = $this->db->table('classes')
->select('class_name')
->where('id', $classId)
->get()
->getRowArray();
$className = trim((string) ($class['class_name'] ?? ''));
if ($className === '') {
return [];
}
$rows = $this->db->table('classes')
->select('id')
->where('class_name', $className)
->where('id !=', $classId)
->get()
->getResultArray();
return array_values(array_filter(array_map(
static fn (array $row): int => (int) ($row['id'] ?? 0),
$rows
)));
}
private function uniqueCurriculumRows(array $rows): array
{
$seen = [];
$unique = [];
foreach ($rows as $row) {
$key = implode('|', [
(string) ($row['subject'] ?? ''),
(string) ($row['unit_number'] ?? ''),
(string) ($row['unit_title'] ?? ''),
(string) ($row['chapter_name'] ?? ''),
]);
if (isset($seen[$key])) {
continue;
}
$seen[$key] = true;
$unique[] = $row;
}
return $unique;
}
}