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 |
Сўровлар
Келинг, фойдаланувчиларни уларнинг шахарлари билан бирга олиб чиқадиган сўров ясайлик. Бунинг учун бизга иккита join амалга ошириш зарур бўлади: биринчи join фойдаланувчиларга боғланиш жадвалини қўшади, иккинчи join эса боғланишлар орқали шахарларни қўшади:
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>