Menghubungkan Melalui Tabel Hubungan di PHP
Sekarang anggap pengguna pernah berada di berbagai kota. Dalam kasus ini, tabel pengguna mungkin memiliki bentuk berikut:
| id | name | city |
|---|---|---|
| 1 | user1 | city1, city2, city3 |
| 2 | user2 | city1, city2 |
| 3 | user3 | city2, city3 |
| 4 | user4 | city1 |
Jelas bahwa menyimpan data seperti ini tidak benar - kota perlu dipindahkan ke tabel terpisah. Berikut tabelnya:
| id | name |
|---|---|
| 1 | city1 |
| 2 | city2 |
| 3 | city3 |
Namun, kita perlu membuat agar setiap pengguna dapat merujuk ke beberapa kota. Dengan dua tabel, hal ini tidak mungkin dilakukan.
Kita perlu memperkenalkan yang disebut tabel hubungan, yang akan menghubungkan pengguna dengan kota-kotanya.
Dalam setiap catatan tabel ini, akan disimpan hubungan antara seorang pengguna dan satu kota. Pada saat yang sama, untuk satu pengguna, akan ada sejumlah catatan dalam tabel ini sesuai dengan jumlah kota yang pernah dikunjunginya.
Berikut tabel hubungan kita:
| id | user_id | city_id |
|---|---|---|
| 1 | 1 | 1 |
| 2 | 1 | 2 |
| 3 | 1 | 3 |
| 4 | 2 | 1 |
| 5 | 2 | 2 |
| 6 | 3 | 2 |
| 7 | 3 | 3 |
| 8 | 4 | 1 |
Tabel pengguna hanya akan menyimpan nama pengguna, tanpa hubungan:
| id | name |
|---|---|
| 1 | user1 |
| 2 | user2 |
| 3 | user3 |
| 4 | user4 |
| 5 | user5 |
Kueri
Mari buat kueri yang akan mengambil pengguna bersama dengan kota-kota mereka. Untuk ini, kita perlu melakukan dua join: join pertama akan menambahkan tabel hubungan ke pengguna, dan join kedua melalui hubungan akan menambahkan kota:
SELECT
users.name as user_name, cities.name as city_name
FROM
users
LEFT JOIN users_cities ON users_cities.user_id=users.id
LEFT JOIN cities ON users_cities.city_id=cities.id
Hasil Kueri
Hasil kueri kita di PHP akan berisi nama setiap pengguna sebanyak jumlah kota yang terkait dengannya:
<?php
$arr = [
['user_name' => 'user1', 'city_name' => 'city1'],
['user_name' => 'user1', 'city_name' => 'city2'],
['user_name' => 'user1', 'city_name' => 'city3'],
['user_name' => 'user2', 'city_name' => 'city1'],
['user_name' => 'user2', 'city_name' => 'city2'],
['user_name' => 'user3', 'city_name' => 'city2'],
['user_name' => 'user3', 'city_name' => 'city3'],
['user_name' => 'user4', 'city_name' => 'city1'],
];
?>
Akan lebih mudah untuk mengonversi array seperti itu dan mengubahnya menjadi berikut:
<?php
$res = [
['user1' => ['city1', 'city2', 'city3']],
['user2' => ['city1', 'city2']],
['user3' => ['city2', 'city3']],
['user4' => ['city1']],
];
?>
Mari tulis kode yang melakukan konversi seperti itu:
<?php
$res = [];
foreach ($data as $elem) {
$res[$elem['user_name']][] = $elem['city_name'];
}
var_dump($res);
?>
Tugas Praktis
Anggap sebuah produk dapat termasuk dalam beberapa kategori. Jelaskan struktur penyimpanannya.
Tulis kueri yang akan mengambil produk bersama dengan kategorinya.
Tampilkan data yang diperoleh dalam bentuk daftar
ul sehingga dalam setiap li di awal
terdapat nama produk, dan setelah titik dua,
diikuti oleh kategori produk tersebut dipisahkan koma.
Contohnya seperti ini:
<ul>
<li>product1: category1, category2, category3</li>
<li>product2: category1, category3</li>
<li>product3: category1</li>
</ul>