PHP-də əlaqə cədvəli vasitəsilə əlaqələndirmə

İndi istifadəçinin müxtəlif şəhərlərdə olduğunu tutaq. Bu halda istifadəçilər cədvəli aşağıdakı kimi ola bilər:

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

Aydındır ki, məlumatları belə saxlamaq düzgün deyil - şəhərlər ayrı bir cədvələ çıxarılmalıdır. Budur o:

cities
id name
1 city1
2 city2
3 city3

Lakin, biz elə etməliyik ki, hər bir istifadəçi bir neçə şəhərə istinad edə bilsin. İki cədvəldən istifadə etməklə bunu etmək mümkün deyil.

Bizim sözdə əlaqə cədvəli təqdim etməyimiz lazımdır, hansı ki, istifadəçini onun şəhərləri ilə əlaqələndirəcək.

Bu cədvəlin hər bir qeydində istifadəçi ilə bir şəhər arasında əlaqə saxlanılacaq. Eyni zamanda bir istifadəçi üçün bu cədvəldə onun olduğu şəhərlərin sayı qədər qeyd olacaq.

Budur bizim əlaqə cədvəlimiz:

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

İstifadəçilər cədvəli yalnız istifadəçi adlarını, əlaqələr olmadan saxlayacaq:

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

Sorğular

Gəlin sorğu edək, onun vasitəsilə istifadəçiləri onların şəhərləri ilə birlikdə çıxaraq. Bunun üçün bizə iki join lazımdır: ilk join istifadəçilərə əlaqə cədvəlini qoşacaq, ikinci join isə əlaqələr vasitəsilə şəhərləri qoşacaq:

sqlSELECT
  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

Sorğunun nəticəsi

Bizim sorğumuzun PHP-dəki nəticəsi hər bir istifadəçinin adını onun əlaqəli olduğu şəhərlərin sayı qədər təkrarlayacaq:

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

Belə bir massivi çevirmək və onu aşağıdakına çevirmək daha rahat olardı:

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

Belə bir çevrilməni həyata keçirən kodu yazaq:

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

Praktiki tapşırıqlar

Задание 1

Tutaq ki, məhsul bir neçə kateqoriyaya aid ola bilər. Saxlama quruluşunu təsvir edin.

Задание 2

Məhsulları onların kateqoriyaları ilə birlikdə çıxaran sorğunu yazın.

Задание 3

Alınan məlumatları ul siyahısı şəklində çıxarın, elə ki, hər bir li-də əvvəlcə məhsulun adı, sonra isə iki nöqtədən sonra vergüllə ayrılmış şəkildə həmin məhsulun kateqoriyaları sadələşdirilsin. Təxminən belə:

html<ul>
  <li>product1: category1, category2, category3</li>
  <li>product2: category1, category3</li>
  <li>product3: category1</li>
</ul>