PHP-de baglanyşyk tablisasy arkaly baglanyşyk
Indi ulanyjynyň dürli şäherlerde bolup geçendigi bolsun. Bu ýagdaýda ulanyjylaryň tablisasy aşakdaky görnüşde bolup biler:
| id | name | city |
|---|---|---|
| 1 | user1 | city1, city2, city3 |
| 2 | user2 | city1, city2 |
| 3 | user3 | city2, city3 |
| 4 | user4 | city1 |
Maglumatlary şeýle saklamak nädogrydygyny düşünmek kyn däl - şäherleri aýratyn tablisada saklamaly. Bu ýerde ol:
| id | name |
|---|---|
| 1 | city1 |
| 2 | city2 |
| 3 | city3 |
Şonda-da, her bir ulanyjy birnäçe şähere salgylanýan etmek isleýäris. Iki tablisa bilen muny etmek mümkin däl.
Biz soňunda baglanyşyk tablisasy diýilýän tablisany girizmeli bolarys, onyň ulanyjy bilen onuň şäherlerini baglajak.
Bu tablisanyň her ýazgyşynda ulanyjy we bir şäheriň arasyndaky baglanyşyk saklanylar. Bu ýagdaýda bir ulanyjy üçin bu tablisada näçe şäherde bolsa, şonça ýazgy bolýar.
Bu bizim baglanyşyk tablisamyz:
| 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 |
Ulanyjylaryň tablisasy diňe ulanyjylaryň adlaryny saklar, baglanyşyklarsyz:
| id | name |
|---|---|
| 1 | user1 |
| 2 | user2 |
| 3 | user3 |
| 4 | user4 |
| 5 | user5 |
Soraglar
Geliň şäherleri bilen bilelikde ulanyjylary alyp çykmaga kömek eder ýaly bir sorag düzedeliň. Bunuň üçin bize iki goşulma (join) gerek bolar: birinji goşulma ulanyjylara baglanyşyk tablisasyny birikdirer, ikinji goşulma bolsa baglanyşyklar boýunça şäherleri birikdirer:
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
Soragyň netijesi
Bizim soragymyzyň PHP-de netijesi her bir ulanyjynyň adyny näçe gezek şäher bilen baglanyşykly bolsa, şonça gezek öz içine alar:
<?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'],
];
?>
Ine şeýle massiw öwürmek we ony aşakdaky görnüşe öwürmek has amatly bolar:
<?php
$res = [
['user1' => ['city1', 'city2', 'city3']],
['user2' => ['city1', 'city2']],
['user3' => ['city2', 'city3']],
['user4' => ['city1']],
];
?>
Ine şeýle öwürmeler ýerine ýetirýän kody ýazalyň:
<?php
$res = [];
foreach ($data as $elem) {
$res[$elem['user_name']][] = $elem['city_name'];
}
var_dump($res);
?>
Amaly meseleler
Harydyň birnäçe kategoriýa degişli bolup bilýändigi bolsun. Saklamanyň gurluşyny beýan ediň.
Harytlary öz kategoriýalary bilen bilelikde alýan soragy ýazyň.
Alynan maglumatlary ul sanawy görnüşinde görkeziň,
ýöne her bir li-de ilki
önümiň ady durmaly, soňra iki nokatdan soň
bu önümiň kategoriýalary vergül bilen sanawlanmaly.
Mysal üçin:
<ul>
<li>product1: category1, category2, category3</li>
<li>product2: category1, category3</li>
<li>product3: category1</li>
</ul>