⊗ppPmDOLVT 384 of 447 menu

Collegamento tramite tabella di relazione in PHP

Supponiamo ora che un utente sia stato in diverse città. In questo caso, la tabella degli utenti potrebbe avere il seguente aspetto:

users
id name city
1 user1 city1, city2, city3
2 user2 city1, city2
3 user3 city2, city3
4 user4 city1

È chiaro che memorizzare i dati in questo modo non è corretto - le città devono essere spostate in una tabella separata. Eccola:

cities
id name
1 city1
2 city2
3 city3

Tuttavia, dobbiamo fare in modo che ogni utente possa riferirsi a più città. Con due tabelle questo è impossibile.

Dobbiamo introdurre la cosiddetta tabella di relazione, che collegherà l'utente alle sue città.

In ogni record di questa tabella verrà memorizzata una relazione tra un utente e una città. In questo modo, per un utente, ci saranno in questa tabella tanti record quante sono le città in cui è stato.

Ecco la nostra tabella di relazione:

users_cities
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

La tabella degli utenti conterrà solo i nomi degli utenti, senza relazioni:

users
id name
1 user1
2 user2
3 user3
4 user4
5 user5

Query

Creiamo una query con la quale estrarremo gli utenti insieme alle loro città. Per fare ciò, avremo bisogno di eseguire due join: il primo join collegherà agli utenti la tabella di relazione, e il secondo join collegherà le città attraverso le relazioni:

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

Risultato della query

Il risultato della nostra query in PHP conterrà il nome di ogni utente tante volte quante sono le città a cui è collegato:

<?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'], ]; ?>

Sarebbe più conveniente convertire un tale array e trasformarlo nel seguente:

<?php $res = [ ['user1' => ['city1', 'city2', 'city3']], ['user2' => ['city1', 'city2']], ['user3' => ['city2', 'city3']], ['user4' => ['city1']], ]; ?>

Scriviamo il codice che esegue tale conversione:

<?php $res = []; foreach ($data as $elem) { $res[$elem['user_name']][] = $elem['city_name']; } var_dump($res); ?>

Compiti pratici

Supponiamo che un prodotto possa appartenere a diverse categorie. Descrivete la struttura di memorizzazione.

Scrivete una query che estragga i prodotti insieme alle loro categorie.

Visualizzate i dati ottenuti sotto forma di elenco ul in modo che in ogni li all'inizio ci sia il nome del prodotto, e dopo i due punti, vengano elencate le categorie di questo prodotto separate da virgola. Circa così:

<ul> <li>product1: category1, category2, category3</li> <li>product2: category1, category3</li> <li>product3: category1</li> </ul>
Italiano
AfrikaansAzərbaycanБългарскиবাংলাБеларускаяČeštinaDanskDeutschΕλληνικάEnglishEspañolEestiSuomiFrançaisहिन्दीMagyarՀայերենIndonesia日本語ქართულიҚазақ한국어КыргызчаLietuviųLatviešuМакедонскиMelayuမြန်မာNederlandsNorskPolskiPortuguêsRomânăРусскийසිංහලSlovenčinaSlovenščinaShqipСрпскиSrpskiSvenskaKiswahiliТоҷикӣไทยTürkmenTürkçeЎзбекOʻzbekTiếng Việt
Utilizziamo i cookie per il funzionamento del sito, l'analisi e la personalizzazione. I dati vengono elaborati in conformità con la Politica sulla privacy.
accetta tutto personalizza rifiuta