PHP හි සම්බන්ධතා වගුව හරහා සම්බන්ධ කිරීම

දැන් භාවිතා කරන්නා විවිධ නගරවල සිටි යුතු යැයි සිතමු. මෙම අවස්ථාවේ දී, භාවිතා කරන්නන්ගේ වගුව පහත රූපය ගත හැකිය:

users
id name city
1 user1 city1, city2, city3
2 user2 city1, city2
3 user3 city2, city3
4 user4 city1

මෙලෙස දත්ත සංරක්ෂණය කිරීම නුසුදුසු බව පැහැදිලිය - නගර වෙනම වගුවකට පිටතට ගත යුතුය. එය මෙන්න:

cities
id name
1 city1
2 city2
3 city3

කෙසේ වෙතත්, සෑම භාවිතා කරන්නෙකුම නගර කිහිපයකට යොමු විය හැකි ආකාරයට කිරීමට අවශ්‍යය. වගු දෙකක් භාවිතයෙන් මෙය කිරීමට නොහැකිය.

අපට අවශ්‍ය වනු ඇත්තේ සම්බන්ධතා වගුව නම් වූ එකක් හඳුන්වා දීමයි, එය භාවිතා කරන්නා ඔහුගේ නගර සමඟ සම්බන්ධ කරයි.

මෙම වගුවේ සෑම ඇතුළත් කිරීමකම භාවිතා කරන්නෙකු සහ එක් නගරයක් අතර සම්බන්ධතාවය ගබඩා වේ. මෙම අවස්ථාවේ දී එක් භාවිතා කරන්නෙකු සඳහා මෙම වගුවේ ඇති ඇතුළත් කිරීම් ගණන ඔහු සිටි නගර ගණනට සමාන වේ.

අපගේ සම්බන්ධතා වගුව මෙන්න:

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

භාවිතා කරන්නන්ගේ වගුව භාවිතා කරන්නන්ගේ නම් පමණක්, සම්බන්ධතා නොමැතිව ගබඩා කරයි:

users
id name
1 user1
2 user2
3 user3
4 user4
5 user5

විමසුම්

භාවිතා කරන්නන් ඔවුන්ගේ නගර සමඟ එකට ඉවත් කරන විමසුමක් කරමු. මේ සඳහා අපට අවශ්‍ය වනු ඇත්තේ සම්බන්ධ කිරීම් (joins) දෙකක්: පළමු සම්බන්ධ කිරීම භාවිතා කරන්නන්ට සම්බන්ධතා වගුව එක් කරන අතර, දෙවන සම්බන්ධ කිරීම සම්බන්ධතා හරහා නගර එක් කරයි:

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

විමසුම් ප්‍රතිඵලය

PHP හි අපගේ විමසුම් ප්‍රතිඵලයේ අඩංගු වන්නේ සෑම භාවිතා කරන්නෙකුගේ නම ඔහු සම්බන්ධ වූ නගර ගණන තරම් වාර ගණනක්:

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'],
  ];
?>

මෙවැනි අරාවක් පරිවර්තනය කර එය පහත ආකෘතියට හරවා ගැනීම වඩාත් පහසු වේ:

php<?php
  $res = [
    ['user1' => ['city1', 'city2', 'city3']],
    ['user2' => ['city1', 'city2']],
    ['user3' => ['city2', 'city3']],
    ['user4' => ['city1']],
  ];
?>

එවැනි පරිවර්තනයක් සිදු කරන කේතය ලියමු:

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

ප්‍රායෝගික කාර්යයන්

Задание 1

නිෂ්පාදනයක් කාණ්ඩ කිහිපයකට අයත් විය හැකියැයි සිතමු. ගබඩා කිරීමේ ව්‍යුහය විස්තර කරන්න.

Задание 2

නිෂ්පාදන ඒවායේ කාණ්ඩ සමඟ එකට ඉවත් කරන විමසුමක් ලියන්න.

Задание 3

ලබාගත් දත්ත ලැයිස්තුවක් ලෙස ul පෙන්වන්න, එමෙන්ම සෑම li එකකම මුලින් නිෂ්පාදන නම පෙනෙන අතර ඊළඟට කොලොන් ලකුණින් පසුව එම නිෂ්පාදනයේ කාණ්ඩ ඉලිප්සිය මගින් ලැයිස්තු ගත කර ඇත. උදාහරණයක් ලෙස:

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