Врзување преку табела за врска во 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>