Hubungan Data Terkait dalam PHP
Misalkan kita dihadapkan pada tugas untuk menyimpan data ayah dan anak laki-laki. Misalkan setiap ayah hanya dapat memiliki satu anak laki-laki, dan anak laki-laki tersebut pada gilirannya juga dapat memiliki satu anak laki-laki.
Kita perlu memikirkan bagaimana kita akan menyimpan datanya.
Ide pertama yang mungkin terlintas di pikiran
- adalah membuat dua tabel: parents untuk
ayah dan sons untuk anak laki-laki. Kemudian menghubungkan
tabel-tabel ini dengan bidang tertentu: son_id
atau parent_id.
Namun, ide ini tidak terlalu baik - karena orang yang sama bisa sekaligus menjadi ayah dan anak laki-laki - dan kita harus menyimpannya di kedua tabel, yang mana hal ini tidak nyaman, memakan lebih banyak ruang dan mudah menyebabkan kesalahan.
Varian yang lebih baik - adalah menghubungkan tabel itu sendiri
dengan dirinya sendiri: mari buat tabel users, di
dalamnya kita akan menyimpan semua pengguna dan untuk setiap pengguna buatkan
bidang son_id, yang akan menyimpan
id anak laki-laki dari tabel yang sama:
| id | name | son_id |
|---|---|---|
| 1 | user1 | 2 |
| 2 | user2 | 3 |
| 3 | user3 | null |
Kueri
Sekarang mari kita tulis kueri yang akan mengambil pengguna beserta anak laki-lakinya.
Pertama-tama, mari ambil pengguna saja:
SELECT
*
FROM
users
Sekarang mari gabungkan (JOIN) dengan anak laki-laki mereka. Kita akan menggabungkan tabel dengan dirinya sendiri, jadi kita perlu melakukan pengubahan namanya:
LEFT JOIN users as sons
Sekarang kita dapat menentukan hubungan antara tabel utama dan tabel yang telah diubah namanya:
LEFT JOIN users as sons ON sons.id=users.son_id
Sekarang mari tentukan bidang-bidangnya:
SELECT
users.name as user_name, sons.name as son_name
Mari satukan semuanya dan kita dapatkan kueri berikut:
SELECT
users.name as user_name, sons.name as son_name
FROM
users
LEFT JOIN users as sons ON sons.id=users.son_id
Tugas Praktis
Misalkan kita memiliki kategori. Setiap kategori dapat termasuk dalam kategori induk, kategori induk tersebut pada gilirannya termasuk dalam kategori induknya sendiri dan seterusnya. Jelaskan struktur penyimpanannya.
Tuliskan kueri yang akan mengambil sebuah kategori beserta kategori induknya.
Tuliskan kueri yang akan mengambil sebuah kategori beserta induk dan kakeknya (induk dari induk).
Tuliskan kueri yang akan mengambil sebuah kategori beserta induk, kakek, dan buyutnya (induk dari kakek).