Везивање преко табеле везе у 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): први спој ће прикључити табелу везе на кориснике, а други спој преко веза прикључиће градове:
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>