Eloquent Relationships
The CPR backend has 63 Eloquent models with extensive relationships. This page documents the key model relationships.
Core Relationships
User
$user->branches() // belongsToMany(Branch) - branches user works at
$user->defaultBranch() // belongsTo(Branch) - user's default branch
$user->branchServices() // belongsToMany(BranchService) - assigned queue servicesTraits: HasApiTokens, HasRoles (Spatie), LogsActivity, Notifiable
Branch
$branch->users() // belongsToMany(User) - staff at this branch
$branch->defaultUsers() // hasMany(User) - users with this as default
$branch->deliveries() // hasMany(Delivery)
$branch->branchServices() // hasMany(BranchService)Uses soft deletes. Settings stored as JSON (operating hours, services config).
Patient
$patient->visits() // hasMany(PatientVisit)
$patient->transactions() // hasMany(Transaction)Key fields: pin (auto-generated code, format BRANCH-XXXXXX), demographics, address components, referral info, photo.
Query scopes: search(), filterByGender(), filterByCivilStatus(), filterByStatus(), filterByBirthDate(), filterByNationality(), filterByTelephone()
PatientVisit
$visit->branch() // belongsTo(Branch)
$visit->patient() // belongsTo(Patient)
$visit->queueTickets() // hasMany(QueueTicket)
$visit->plans() // hasMany(PatientVisitPlan)Status tracked via PatientVisitStatus enum (active, completed).
Transaction
$transaction->queueTicket() // belongsTo(QueueTicket)
$transaction->branch() // belongsTo(Branch)
$transaction->patient() // belongsTo(Patient)
$transaction->paymentMethod() // belongsTo(PaymentMethod)
$transaction->items() // hasMany(TransactionItem)Transaction numbers are auto-generated with format TRX-XXXXXXXXXX.
QueueTicket
$ticket->visit() // belongsTo(PatientVisit)
$ticket->service() // belongsTo(BranchService)
$ticket->patient() // belongsTo(Patient)
$ticket->transferredFrom() // belongsTo(QueueTicket) - self-reference
$ticket->registeredBy() // belongsTo(User)
$ticket->calledBy() // belongsTo(User)
$ticket->servedBy() // belongsTo(User)
$ticket->transferredBy() // belongsTo(User)
$ticket->billingTransactions() // hasMany(PatientBillingTransaction)
$ticket->medicineTransaction() // hasOne(Transaction)Status tracked via QueueTicketStatus enum. Supports priority types and appointment flags.
Clinical Examination Models
All clinical exam models share the same base relationship:
$exam->patientVisit() // belongsTo(PatientVisit)14 exam models: VisualAcuity, Refraction, Tonometry, SlitLamp, Funduscopy, Gonioscopy, CornealTopography, AmslerGrid, Eom, Exophthalmometry, LacrimalIrrigation, Radiology, GrossExamination, IndirectOphthalmoscopy
Pharmacy & Inventory
PharmacyItem
$item->category() // belongsTo(PharmacyItemCategory)
$item->form() // belongsTo(PharmacyItemForm)
$item->unit() // belongsTo(StockAvailableUnit)
$item->stockAvailables() // hasMany(StockAvailable)Supply Chain
PurchaseOrder → PurchaseOrderDetail → Delivery → DeliveryDetailStock movements track FIFO deductions when transactions are completed.
Service & Queue
$branchService->branch() // belongsTo(Branch)
$branchService->service() // belongsTo(Service)
$branchService->counters() // hasMany(BranchServiceCounter)
$branchService->users() // belongsToMany(User)Common Traits
LogsActivity
All models use Spatie's LogsActivity trait, which automatically logs create, update, and delete operations to the activity_log table.
Relationship Diagram
User ──┬── Branch (many-to-many via branch_users)
├── BranchService (many-to-many)
└── Role (many-to-many via Spatie)
Patient ──┬── PatientVisit
│ ├── QueueTicket
│ │ ├── PatientBillingTransaction
│ │ └── Transaction (medicine)
│ ├── PatientVisitPlan
│ ├── PatientVisitPrescribedMedicine
│ ├── Complaint
│ ├── MedicalCertificate
│ └── [14 Clinical Exam Models]
└── Transaction (billing)
Branch ──┬── BranchService
│ ├── BranchServiceCounter
│ └── QueueTicket
├── Delivery
└── PatientVisit
PharmacyItem ── StockAvailable
└── TransactionItem
PurchaseOrder ── PurchaseOrderDetail
Delivery ── DeliveryDetail