Kuunganisha Kupitia Jedwali la Uhusiano katika PHP
Hebu sasa mtumiaji amekuwepo katika miji tofauti. Katika kesi hii, jedwali la watumiaji linaweza kuwa na muonekano ufuatao:
| id | name | city |
|---|---|---|
| 1 | user1 | city1, city2, city3 |
| 2 | user2 | city1, city2 |
| 3 | user3 | city2, city3 |
| 4 | user4 | city1 |
Ni wazi kuwa kuhifadhi data kwa njia hii sio sahihi - miji inahitaji kutolewa kwenye jedwali tofauti. Hapa iko:
| id | name |
|---|---|
| 1 | city1 |
| 2 | city2 |
| 3 | city3 |
Hata hivyo, tunahitaji kufanya hivi ili kila mtumiaji aweze kurejelea miji kadhaa. Kwa kutumia jedwali mbili hii haiwezekani kufanyika.
Tutahitaji kuanzisha kinachojulikana kama jedwali la uhusiano, ambalo litaunganisha mtumiaji na miji yake.
Kwa kila kuingia kwenye jedwali hili, kutawekwa uhusiano kati ya mtumiaji na mji mmoja. Wakati huo huo, kwa mtumiaji mmoja katika jedwali hili kutakuwa na ingizo kadiri ya idadi ya miji aliyowahi kuwepo.
Hapa kuna jedwali letu la uhusiano:
| 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 |
Jedwali la watumiaji litahifadhi majina tu ya watumiaji, bila miunganisho:
| id | name |
|---|---|
| 1 | user1 |
| 2 | user2 |
| 3 | user3 |
| 4 | user4 |
| 5 | user5 |
Maswali
Hebu tufanye swali, ambalo kwa kutumia litatoa watumiaji pamoja na miji yao. Kwa hili tutahitaji kufanya viunganisho viwili: kiunganisho cha kwanza kitaunganisha kwa watumiaji jedwali la uhusiano, na kiunganisho cha pili kupitia viunganisho kitaunganisha miji:
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
Matokeo ya swali
Matokeo ya swali letu katika PHP yatakuwa na jina la kila mtumiaji mara kadiri ya idadi ya miji anayounganishwa nayo:
<?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'],
];
?>
Itakuwa rahisi zaidi kubadilisha safu kama hii na kuigeuza kuwa ifuatayo:
<?php
$res = [
['user1' => ['city1', 'city2', 'city3']],
['user2' => ['city1', 'city2']],
['user3' => ['city2', 'city3']],
['user4' => ['city1']],
];
?>
Wacha tuandike msimbo, unaotekeleza ubadilishaji kama huo:
<?php
$res = [];
foreach ($data as $elem) {
$res[$elem['user_name']][] = $elem['city_name'];
}
var_dump($res);
?>
Kazi za Vitendo
Hebu bidhaa iweze kuwa ya kategoria kadhaa. Eleza muundo wa uhifadhi.
Andika swali, ambalo litatoa bidhaa pamoja na kategoria zake.
Onyesha data zilizopatikana kwa mfumo wa orodha
ul kiasi kwamba katika kila li mwanzo
kuwe jina la bidhaa, na baada ya koloni kwa kutumia
comma, kategoria za bidhaa hii ziorodheshwe.
Kwa mfano kama hivi:
<ul>
<li>product1: category1, category2, category3</li>
<li>product2: category1, category3</li>
<li>product3: category1</li>
</ul>