Выборка через таблицу связи в Dart
Запрос, который вытащит юзеров вместе с их городами, делает два соединения: первое присоединит к юзерам таблицу связи, а второе по связям присоединит города:
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
Результат запроса в Dart содержит имя каждого юзера столько раз, со сколькими городами он связан:
var data = [
{'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'},
];
Удобнее переконвертировать такой результат и превратить его в следующий:
var res = {
'user1': ['city1', 'city2', 'city3'],
'user2': ['city1', 'city2'],
'user3': ['city2', 'city3'],
'user4': ['city1'],
};
Напишем код, выполняющий такую конвертацию:
var data = [
{'user_name': 'user1', 'city_name': 'city1'},
{'user_name': 'user1', 'city_name': 'city2'},
{'user_name': 'user2', 'city_name': 'city1'},
];
var res = <String, List<String>>{};
for (var elem in data) {
var name = elem['user_name'] as String;
var city = elem['city_name'] as String;
res.putIfAbsent(name, () => []).add(city);
}
print(res);
Напишите запрос, который достанет товары вместе с их категориями. Товар может принадлежать нескольким категориям.
Выведите полученные данные в консоль так, чтобы в каждой строке сначала стояло имя продукта, а после двоеточия через запятую перечислялись категории этого продукта:
product1: category1, category2, category3
product2: category1, category3
product3: category1