Menghubungkan Melalui Tabel Hubungan di PHP

Sekarang anggap pengguna pernah berada di berbagai kota. Dalam kasus ini, tabel pengguna mungkin memiliki bentuk berikut:

users
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:

cities
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:

users_cities
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:

users
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:

sqlSELECT
  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<?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<?php
  $res = [
    ['user1' => ['city1', 'city2', 'city3']],
    ['user2' => ['city1', 'city2']],
    ['user3' => ['city2', 'city3']],
    ['user4' => ['city1']],
  ];
?>

Mari tulis kode yang melakukan konversi seperti itu:

php<?php
  $res = [];
  
  foreach ($data as $elem) {
    $res[$elem['user_name']][] = $elem['city_name'];
  }
  
  var_dump($res);
?>

Tugas Praktis

Задание 1

Anggap sebuah produk dapat termasuk dalam beberapa kategori. Jelaskan struktur penyimpanannya.

Задание 2

Tulis kueri yang akan mengambil produk bersama dengan kategorinya.

Задание 3

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:

html<ul>
  <li>product1: category1, category2, category3</li>
  <li>product2: category1, category3</li>
  <li>product3: category1</li>
</ul>