Contact (HasContact)
File: app/Traits/Common/HasContact.php
Trait Eloquent Laravel yang menghubungkan informasi kontak (telepon, WhatsApp, email, alamat, dll.) ke model manapun melalui tabel contacts terpusat — dengan dukungan untuk nilai kontak tunggal maupun ganda per tipe.
Ringkasan
Daripada menambahkan kolom phone, email, whatsapp ke setiap model yang butuh info kontak, trait HasContact menyimpan semua kontak di tabel master contacts dan mengelola relasi secara otomatis.
Dua mode:
| Mode | Deskripsi | Contoh |
|---|---|---|
| Direct Contact | Model punya kolom kontak sendiri (phone_contact_id) | School, Employee |
| Polymorphic Contact | Pakai relasi contacts() + ekstraksi pendingContacts | Model tanpa kolom kontak dedicated |
Kenapa Ada
- Normalisasi: Semua data kontak di satu tabel
contacts, tidak duplikasi antar model - Enkripsi: Nilai kontak bisa disimpan terenkripsi
- Fleksibel: Dukungan untuk kontak tunggal (satu telepon) dan ganda (banyak nomor)
- Otomatis: Set
$model->phone = '08123456789'— trait handle lookup, creation, relationship
Konfigurasi
php
class School extends Model
{
use HasContact;
protected array $contacts = [
'phone',
'email',
'whatsapp',
'social_media' => ['multiple' => true],
];
}| Format | Kolom | Relasi | Kardinalitas |
|---|---|---|---|
'phone' | phone_contact_id | phoneContact() | Tunggal (BelongsTo) |
'sosmed' => ['multiple' => true] | sosmed_contact_ids | sosmedContacts() | Ganda (HasMany-like) |
Cara Pakai
php
// Set
$school->phone = '08123456789';
$school->email = 'info@sutomo.sch.id';
$school->social_media = ['@sutomo', '@sutomo_school'];
$school->save();
// Read
$school->phone; // "08123456789"
$school->social_media; // ["@sutomo", "@sutomo_school"]
// Explicit
$school->getContactValue('phone'); // "08123456789"
$school->getContactValues('social_media'); // ["@sutomo", "@sutomo_school"]File Penting
| File | Tujuan |
|---|---|
app/Traits/Common/HasContact.php | Trait — attachment kontak, ekstraksi, relasi |
app/Models/Platform/Contact/Contact.php | Model contacts — type, censored, encrypted |
app/Models/ | Model mana pun yang pakai use HasContact |