დაკავშირება დამაკავშირებელი ცხრილის მეშვეობით PHP-ში
დავუშვათ, ახლა მომხმარებელი იყო სხვადასხვა ქალაქში. ამ შემთხვევაში, მომხმარებლების ცხრილს შეიძლება ჰქონდეს შემდეგი სახე:
| id | name | city |
|---|---|---|
| 1 | user1 | city1, city2, city3 |
| 2 | user2 | city1, city2 |
| 3 | user3 | city2, city3 |
| 4 | user4 | city1 |
გასაგებია, რომ მონაცემების ასე შენახვა არასწორია - ქალაქები უნდა იყოს გამოყოფილი ცალკე ცხრილში. აი ის:
| id | name |
|---|---|
| 1 | city1 |
| 2 | city2 |
| 3 | city3 |
თუმცა, ჩვენ გვსურს, რომ თითოეულმა მომხმარებელმა შეძლოს რამდენიმე ქალაქზე მითითება. ამის გაკეთება ორი ცხრილის საშუალებით შეუძლებელია.
ჩვენ გვჭირდება ე.წ. დამაკავშირებელი ცხრილის შემოღება, რომელიც დააკავშირებს მომხმარებელს მის ქალაქებთან.
ამ ცხრილის თითოეულ ჩანაწერში ინახება კავშირი მომხმარებელსა და ერთ ქალაქს შორის. ამ შემთხვევაში ერთი მომხმარებლისთვის ამ ცხრილში იმდენი ჩანაწერი იქნება, რამდენ ქალაქშიც ის ყოფილა.
აი ჩვენი დამაკავშირებელი ცხრილი:
| 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 |
მომხმარებლების ცხრილი შეინახავს მხოლოდ მომხმარებლების სახელებს, კავშირების გარეშე:
| id | name |
|---|---|
| 1 | user1 |
| 2 | user2 |
| 3 | user3 |
| 4 | user4 |
| 5 | user5 |
მოთხოვნები
მოდით, შევქმნათ მოთხოვნა, რომლის საშუალებითაც ამოვიღებთ მომხმარებლებს მათ ქალაქებთან ერთად. ამისთვის ჩვენ დაგვჭირდება ორი join-ის გაკეთება: პირველი join დააკავშირებს მომხმარებლებს დამაკავშირებელ ცხრილს, ხოლო მეორე join კავშირების მეშვეობით დააკავშირებს ქალაქებს:
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
მოთხოვნის შედეგი
ჩვენი მოთხოვნის შედეგი 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'],
];
?>
უფრო მოსახერხებელი იქნებოდა ასეთი მასივის კონვერტაცია და მისი გარდაქმნა შემდეგში:
<?php
$res = [
['user1' => ['city1', 'city2', 'city3']],
['user2' => ['city1', 'city2']],
['user3' => ['city2', 'city3']],
['user4' => ['city1']],
];
?>
დავწეროთ კოდი, რომელიც ასრულებს ასეთ კონვერტაციას:
<?php
$res = [];
foreach ($data as $elem) {
$res[$elem['user_name']][] = $elem['city_name'];
}
var_dump($res);
?>
პრაქტიკული ამოცანები
დავუშვათ, პროდუქტს შეუძლია რამდენიმე კატეგორიას მიეკუთვნოს. აღწერეთ შენახვის სტრუქტურა.
დაწერეთ მოთხოვნა, რომელიც ამოიღებს პროდუქტებს მათ კატეგორიებთან ერთად.
გამოაჩინეთ მიღებული მონაცემები სიის
ul სახით ისე, რომ თითოეულ li-ში თავიდან
იყოს პროდუქტის სახელი, ხოლო მძიმით გამოყოფილი
კოლონის შემდეგ ამ პროდუქტის კატეგორიები.
დაახლოებით ასე:
<ul>
<li>product1: category1, category2, category3</li>
<li>product2: category1, category3</li>
<li>product3: category1</li>
</ul>