Pautan melalui Jadual Pautan dalam PHP
Sekarang katakan pengguna pernah berada di bandar-bandar yang berbeza. Dalam kes ini, jadual pengguna mungkin kelihatan seperti berikut:
| id | name | city |
|---|---|---|
| 1 | user1 | city1, city2, city3 |
| 2 | user2 | city1, city2 |
| 3 | user3 | city2, city3 |
| 4 | user4 | city1 |
Jelas sekali, menyimpan data dengan cara ini adalah tidak betul - bandar-bandar perlu dipindahkan ke jadual berasingan. Inilah jadual tersebut:
| id | name |
|---|---|
| 1 | city1 |
| 2 | city2 |
| 3 | city3 |
Walau bagaimanapun, kita perlu memastikan bahawa setiap pengguna boleh merujuk kepada beberapa bandar. Ini mustahil untuk dilakukan dengan hanya dua jadual.
Kita perlu memperkenalkan apa yang dipanggil jadual pautan, yang akan menghubungkan pengguna dengan bandar-bandarnya.
Setiap catatan dalam jadual ini akan menyimpan satu pautan antara seorang pengguna dan satu bandar. Pada masa yang sama, untuk satu pengguna, akan terdapat banyak catatan dalam jadual ini sebanyak bandar yang pernah dia kunjungi.
Inilah jadual pautan kami:
| 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 |
Jadual pengguna hanya akan menyimpan nama pengguna, tanpa pautan:
| id | name |
|---|---|
| 1 | user1 |
| 2 | user2 |
| 3 | user3 |
| 4 | user4 |
| 5 | user5 |
Pertanyaan
Mari buat pertanyaan yang akan mengambil pengguna bersama-sama dengan bandar mereka. Untuk ini, kita perlu membuat dua sambungan: sambungan pertama akan menyambung jadual pautan kepada pengguna, dan sambungan kedua melalui pautan akan menyambung bandar-bandar:
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
Keputusan Pertanyaan
Keputusan pertanyaan kami dalam PHP akan mengandungi nama setiap pengguna sebanyak kali yang dia dikaitkan dengan bandar:
<?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'],
];
?>
Lebih mudah untuk menukar tatasusunan sedemikian dan mengubahnya menjadi yang berikut:
<?php
$res = [
['user1' => ['city1', 'city2', 'city3']],
['user2' => ['city1', 'city2']],
['user3' => ['city2', 'city3']],
['user4' => ['city1']],
];
?>
Mari tulis kod yang melakukan penukaran sedemikian:
<?php
$res = [];
foreach ($data as $elem) {
$res[$elem['user_name']][] = $elem['city_name'];
}
var_dump($res);
?>
Tugas Amali
Katakan produk boleh tergolong dalam beberapa kategori. Terangkan struktur penyimpanan.
Tulis pertanyaan yang akan mengambil produk bersama-sama dengan kategori mereka.
Paparkan data yang diperoleh dalam bentuk senarai
ul supaya dalam setiap li pada awalnya
terdapat nama produk, dan selepas titik bertindih,
kategori produk tersebut disenaraikan dipisahkan dengan koma.
Contohnya seperti ini:
<ul>
<li>product1: category1, category2, category3</li>
<li>product2: category1, category3</li>
<li>product3: category1</li>
</ul>