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:

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

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

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

Tabela me përdoruesit do të ruajë vetëm emrat e përdoruesve, pa lidhje:

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

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

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<?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<?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<?php
  $res = [];
  
  foreach ($data as $elem) {
    $res[$elem['user_name']][] = $elem['city_name'];
  }
  
  var_dump($res);
?>

Detyra praktike

Задание 1

Le të supozojmë që një produkt mund t'i përkasë disa kategori. Përshkruani strukturën e ruajtjes.

Задание 2

Shkruani një kërkesë që do të nxjerrë produktet së bashku me kategoritë e tyre.

Задание 3

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:

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