Lidhja përmes tabelës së lidhjes në PHP
Le të supozojmë tani që përdoruesi ka qenë në qytete të ndryshme. Në këtë rast, tabela me përdoruesit mund të kishte pamjen e mëposhtme:
| id | name | city |
|---|---|---|
| 1 | user1 | city1, city2, city3 |
| 2 | user2 | city1, city2 |
| 3 | user3 | city2, city3 |
| 4 | user4 | city1 |
Është e qartë se të ruash të dhëna në këtë mënyrë nuk është e saktë - qytetet duhet të nxirren në një tabelë të veçantë. Ja ku është ajo:
| id | name |
|---|---|
| 1 | city1 |
| 2 | city2 |
| 3 | city3 |
Sidoqoftë, ne duhet të bëjmë që çdo përdorues të mund t'i referohet disa qyteteve. Kjo nuk mund të bëhet duke përdorur dy tabela.
Do të na duhet të prezantojmë të ashtuquajturën tabelë të lidhjes, e cila do të lidhë përdoruesin me qytetet e tij.
Në çdo regjistrim të kësaj tabele do të ruhet lidhja midis një përdoruesi dhe një qyteti. Në të njëjtën kohë për një përdorues në këtë tabelë do të ketë aq regjistrime sa qytete ka qenë.
Ja tabela jonë e lidhjes:
| 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 |
Tabela me përdoruesit do të ruajë vetëm emrat e përdoruesve, pa lidhje:
| id | name |
|---|---|
| 1 | user1 |
| 2 | user2 |
| 3 | user3 |
| 4 | user4 |
| 5 | user5 |
Kërkesat
Le të bëjmë një kërkesë me të cilën do të nxjerrim përdoruesit së bashku me qytetet e tyre. Për këtë do të na duhen të bëjmë dy join: join-i i parë do t'i bashkëngjijë përdoruesve tabelën e lidhjes, dhe join-i i dytë përmes lidhjeve do t'i bashkëngjijë qytetet:
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
Rezultati i kërkesës
Rezultati i kërkesës sonë në PHP do të përmbajë emrin e çdo përdoruesi aq herë, me sa qytete është i lidhur:
<?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'],
];
?>
Do të ishte më e përshtatshme të konvertohej një grup i tillë dhe ta shndërronim atë në vijim:
<?php
$res = [
['user1' => ['city1', 'city2', 'city3']],
['user2' => ['city1', 'city2']],
['user3' => ['city2', 'city3']],
['user4' => ['city1']],
];
?>
Le të shkruajmë kodin që kryen një konvertim të tillë:
<?php
$res = [];
foreach ($data as $elem) {
$res[$elem['user_name']][] = $elem['city_name'];
}
var_dump($res);
?>
Detyra praktike
Le të supozojmë që një produkt mund t'i përkasë disa kategori. Përshkruani strukturën e ruajtjes.
Shkruani një kërkesë që do të nxjerrë produktet së bashku me kategoritë e tyre.
Shfaqni të dhënat e marra në formën e një liste
ul në mënyrë që në çdo li në fillim
të jetë emri i produktit, dhe pas dy pikëve përmes
presje të listohen kategoritë e këtij produkti.
Përafërsisht kështu:
<ul>
<li>product1: category1, category2, category3</li>
<li>product2: category1, category3</li>
<li>product3: category1</li>
</ul>