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

কোয়েরি

আসুন একটি কোয়েরি করি, যার মাধ্যমে আমরা ব্যবহারকারীদের তাদের শহরগুলি সহ বের করে আনব। এর জন্য আমাদের দুটি জয়ইন করতে হবে: প্রথম জয়ইন ব্যবহারকারীদের সাথে সংযোগ টেবিলটি যুক্ত করবে, এবং দ্বিতীয় জয়ইন সংযোগের মাধ্যমে শহরগুলি যুক্ত করবে:

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>