Skakeling deur 'n skakeltafel in PHP
Kom ons sê nou 'n gebruiker was in verskillende stede. In hierdie geval kan die tabel met gebruikers die volgende voorkoms hê:
| id | name | city |
|---|---|---|
| 1 | user1 | city1, city2, city3 |
| 2 | user2 | city1, city2 |
| 3 | user3 | city2, city3 |
| 4 | user4 | city1 |
Dit is duidelik dat dit verkeerd is om data so te stoor - stede moet in 'n aparte tabel geplaas word. Hier is dit:
| id | name |
|---|---|
| 1 | city1 |
| 2 | city2 |
| 3 | city3 |
Ons moet egter maak dat elke gebruiker na verskeie stede kan verwys. Met twee tabelle is dit onmoontlik.
Ons sal die sogenaamde skakeltafel moet invoer, wat die gebruiker met sy stede sal koppel.
In elke rekord van hierdie tabel sal 'n skakel tussen 'n gebruiker en een stad gestoor word. In hierdie geval sal daar vir een gebruiker soveel rekords in hierdie tabel wees as stede waarin hy was.
Hier is ons skakeltafel:
| 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 |
Die tabel met gebruikers sal slegs name van gebruikers stoor, sonder skakels:
| id | name |
|---|---|
| 1 | user1 |
| 2 | user2 |
| 3 | user3 |
| 4 | user4 |
| 5 | user5 |
Navrae
Kom ons maak 'n navraag waarmee ons gebruikers saam met hul stede sal uittrek. Vir dit sal ons twee joins moet doen: die eerste join sal die skakeltafel by die gebruikers voeg, en die tweede join sal deur die skakels die stede byvoeg:
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
Resultaat van die navraag
Die resultaat van ons navraag in PHP sal die naam van elke gebruiker bevat soveel keer as met hoeveel stede dit gekoppel is:
<?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'],
];
?>
Dit sou makliker wees om so 'n array te omskep en dit in die volgende te verander:
<?php
$res = [
['user1' => ['city1', 'city2', 'city3']],
['user2' => ['city1', 'city2']],
['user3' => ['city2', 'city3']],
['user4' => ['city1']],
];
?>
Kom ons skryf kode wat so 'n omskakeling uitvoer:
<?php
$res = [];
foreach ($data as $elem) {
$res[$elem['user_name']][] = $elem['city_name'];
}
var_dump($res);
?>
Praktiese take
Kom ons sê 'n produk kan tot verskeie kategorieë behoort. Skryf die bergstruktuur uiteen.
Skryf 'n navraag wat produkte sal uithaal saam met hul kategorieë.
Vertoon die verkrygte data in die vorm van 'n lys
ul sodat in elke li aanvanklik
die produknaam staan, en na die dubbelpunt, geskei deur
kommas, word die kategorieë van hierdie produk gelys.
So ongeveer:
<ul>
<li>product1: category1, category2, category3</li>
<li>product2: category1, category3</li>
<li>product3: category1</li>
</ul>