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:
| 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:
| 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:
| 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:
| 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:
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
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
$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
$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
$res = [];
foreach ($data as $elem) {
$res[$elem['user_name']][] = $elem['city_name'];
}
var_dump($res);
?>
Praktiki tapşırıqlar
Tutaq ki, məhsul bir neçə kateqoriyaya aid ola bilər. Saxlama quruluşunu təsvir edin.
Məhsulları onların kateqoriyaları ilə birlikdə çıxaran sorğunu yazın.
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ə:
<ul>
<li>product1: category1, category2, category3</li>
<li>product2: category1, category3</li>
<li>product3: category1</li>
</ul>