Получение данных из связанных таблиц в Dart
Запрос, который достанет всех юзеров вместе с их
городами, строят с командой
LEFT JOIN:
Его синтаксис выглядит следующим образом:
SELECT поля FROM имя_таблицы
LEFT JOIN имя_связанной_таблицы ON условие_связи
WHERE условие_выборки
Разберем отдельные части синтаксиса этой команды.
Поля. Так как выборка идет из
нескольких таблиц, выборка всех полей через
* не будет работать. Следующий запрос
выберет поля только из основной таблицы, но
не из связанной:
SELECT *
Чтобы данные выбирались из всех таблиц, перед
* указывают имя таблицы для выборки:
SELECT users.*, cities.*
Либо перечисляют нужные поля с указанием имени таблицы перед ними:
SELECT users.name, cities.name
Эти два способа имеют проблему. Если поля в таблицах имеют одинаковые имена, в результате запроса произойдет конфликт имен и останется только одно поле, а второго не будет. В Dart значение колонки читают через индекс строки, и второе значение с тем же именем уже не достать.
Для решения проблемы конфликтные имена
переименовывают через команду AS:
SELECT users.name, cities.name AS city_name
Связь. После команды ON
указывают поля из двух таблиц, по которым
осуществляется связь. В этом случае это поле
id из таблицы с городами и поле
city_id из таблицы с юзерами:
ON cities.id = users.city_id
Запрос. В итоге запрос, который достанет юзеров вместе с их городами, будет выглядеть следующим образом:
SELECT
users.name, cities.name AS city_name
FROM
users
LEFT JOIN cities ON cities.id = users.city_id
В Dart эту строку передают в select.
Колонку после AS читают по новому имени:
import 'package:sqlite3/sqlite3.dart';
var db = sqlite3.open('users_cities.db');
var rows = db.select('''
SELECT
users.name, cities.name AS city_name
FROM
users
LEFT JOIN cities ON cities.id = users.city_id
''');
for (var row in rows) {
print(row['name']);
print(row['city_name']);
}
db.dispose();
Пусть есть таблица с товарами и таблица с их категориями. Напишите запрос, который достанет названия товаров вместе с их категориями.