PHP में लिंकिंग टेबल के माध्यम से संबंध
अब मान लीजिए कि उपयोगकर्ता अलग-अलग शहरों में रहा है। इस स्थिति में उपयोगकर्ताओं की टेबल इस प्रकार दिख सकती है:
| id | name | city |
|---|---|---|
| 1 | user1 | city1, city2, city3 |
| 2 | user2 | city1, city2 |
| 3 | user3 | city2, city3 |
| 4 | user4 | city1 |
यह स्पष्ट है कि इस तरह डेटा स्टोर करना गलत है - शहरों को एक अलग टेबल में रखा जाना चाहिए। यह रही वह टेबल:
| id | name |
|---|---|
| 1 | city1 |
| 2 | city2 |
| 3 | city3 |
हालाँकि, हमें यह सुनिश्चित करना होगा कि प्रत्येक उपयोगकर्ता कई शहरों को संदर्भित कर सके। यह दो टेबलों के साथ करना असंभव है।
हमें एक तथाकथित लिंकिंग टेबल पेश करने की आवश्यकता होगी, जो उपयोगकर्ता को उसके शहरों से जोड़ेगी।
इस टेबल की प्रत्येक एंट्री में एक उपयोगकर्ता और एक शहर के बीच का संबंध संग्रहीत होगा। इसके साथ ही एक उपयोगकर्ता के लिए इस टेबल में उतनी ही एंट्रीज होंगी, जितने शहरों में वह रहा है।
यह रही हमारी लिंकिंग टेबल:
| 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 |
उपयोगकर्ताओं की टेबल केवल उपयोगकर्ता नाम स्टोर करेगी, बिना किसी लिंक के:
| id | name |
|---|---|
| 1 | user1 |
| 2 | user2 |
| 3 | user3 |
| 4 | user4 |
| 5 | user5 |
क्वेरीज
आइए एक क्वेरी बनाते हैं, जिसकी सहायता से हम उपयोगकर्ताओं को उनके शहरों के साथ प्राप्त कर सकें। इसके लिए हमें दो जॉइन करने की आवश्यकता होगी: पहला जॉइन उपयोगकर्ताओं को लिंकिंग टेबल से जोड़ेगा, और दूसरा जॉइन लिंक के माध्यम से शहरों को जोड़ेगा:
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
क्वेरी का परिणाम
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
$res = [
['user1' => ['city1', 'city2', 'city3']],
['user2' => ['city1', 'city2']],
['user3' => ['city2', 'city3']],
['user4' => ['city1']],
];
?>
आइए ऐसा रूपांतरण करने वाला कोड लिखते हैं:
<?php
$res = [];
foreach ($data as $elem) {
$res[$elem['user_name']][] = $elem['city_name'];
}
var_dump($res);
?>
व्यावहारिक कार्य
मान लीजिए कि एक उत्पाद कई श्रेणियों से संबंधित हो सकता है। स्टोरेज संरचना लिखें।
एक क्वेरी लिखें जो उत्पादों को उनकी श्रेणियों के साथ प्राप्त करे।
प्राप्त डेटा को एक ul सूची के रूप में प्रदर्शित करें
ताकि प्रत्येक li में सबसे पहले
उत्पाद का नाम हो, और उसके बाद कोलन के बाद कॉमा से
उस उत्पाद की श्रेणियों की सूची हो।
कुछ इस तरह:
<ul>
<li>product1: category1, category2, category3</li>
<li>product2: category1, category3</li>
<li>product3: category1</li>
</ul>