⊗ppPmDOLVT 384 of 447 menu

Łączenie przez tabelę łączenia w PHP

Załóżmy teraz, że użytkownik był w różnych miastach. W tym przypadku tabela z użytkownikami mogłaby mieć następujący wygląd:

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

Oczywiste jest, że przechowywanie danych w ten sposób jest nieprawidłowe - miasta należy przenieść do osobnej tabeli. Oto ona:

cities
id name
1 city1
2 city2
3 city3

Jednakże, musimy sprawić, aby każdy użytkownik mógł odnosić się do kilku miast. Za pomocą dwóch tabel jest to niemożliwe.

Będziemy potrzebować wprowadzić tak zwaną tabelę łączenia, która będzie łączyć użytkownika z jego miastami.

W każdym wpisie tej tabeli będzie przechowywane połączenie między użytkownikiem a jednym miastem. Przy tym dla jednego użytkownika w tej tabeli będzie tyle wpisów, w ilu miastach był.

Oto nasza tabela łączenia:

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

Tabela z użytkownikami będzie przechowywać tylko nazwy użytkowników, bez połączeń:

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

Zapytania

Zróbmy zapytanie, za pomocą którego pobierzemy użytkowników razem z ich miastami. Do tego będziemy potrzebować dwóch złączeń: pierwsze złączenie dołączy do użytkowników tabelę łączenia, a drugie złączenie po połączeniach dołączy miasta:

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

Wynik zapytania

Wynik naszego zapytania w PHP będzie zawierał imię każdego użytkownika tyle razy, z iloma miastami jest powiązany:

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

Wygodniej byłoby przekonwertować taką tablicę i przekształcić ją w następującą:

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

Napiszmy kod wykonujący taką konwersję:

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

Zadania praktyczne

Załóżmy, że produkt może należeć do kilku kategorii. Opisz strukturę przechowywania.

Napisz zapytanie, które pobierze produkty razem z ich kategoriami.

Wyświetl otrzymane dane w postaci listy ul tak, aby w każdej li na początku stała nazwa produktu, a po dwukropku przez przecinek były wymienione kategorie tego produktu. Przykładowo:

<ul> <li>product1: category1, category2, category3</li> <li>product2: category1, category3</li> <li>product3: category1</li> </ul>
Polski
AfrikaansAzərbaycanБългарскиবাংলাБеларускаяČeštinaDanskDeutschΕλληνικάEnglishEspañolEestiSuomiFrançaisहिन्दीMagyarՀայերենIndonesiaItaliano日本語ქართულიҚазақ한국어КыргызчаLietuviųLatviešuМакедонскиMelayuမြန်မာNederlandsNorskPortuguêsRomânăРусскийසිංහලSlovenčinaSlovenščinaShqipСрпскиSrpskiSvenskaKiswahiliТоҷикӣไทยTürkmenTürkçeЎзбекOʻzbekTiếng Việt
Wykorzystujemy pliki cookie do działania strony, analizy i personalizacji. Przetwarzanie danych odbywa się zgodnie z Polityką prywatności.
zaakceptuj wszystkie dostosuj odrzuć