Foreign keys supportΒΆ
The database models support foreign keys. Example: create a foreign key model:
class Manufacturer with DbModel {
Manufacturer({this.name});
final String name;
@override
int id;
@override
Db get db => conf.db;
@override
DbTable get table => manufacturerTable;
@override
Map<String, dynamic> toDb() => <String, dynamic>{"name": name};
@override
Manufacturer fromDb(Map<String, dynamic> map) =>
Manufacturer(name: map["name"].toString());
}
To set a foreign key mention it in your table schema:
final carTable = DbTable("car")
..varchar("name")
..real("price")
..foreign_key("manufacturer");
Update the serializers in the main model to use the foreign key:
class Car with DbModel {
@override
Map<String, dynamic> toDb() {
final row = <String, dynamic>{
// ...
"manufacturer": manufacturer.id
};
return row;
}
@override
Car fromDb(Map<String, dynamic> map) {
final car = Car(
// ...
);
// the key will be present only with join queries
// in a simple select this data is not present
if (map.containsKey("manufacturer")) {
car.manufacturer =
Manufacturer().fromDb(map["manufacturer"] as Map<String, dynamic>);
}
return car;
}
}
To perform a join query:
class Car with DbModel {
static Future<List<Car>> selectRelated({String where, int limit}) async {
final cars = List<Car>.from(
await Car().sqlJoin(where: where, limit: limit));
return cars;
}
}
And then use it:
List<Car> cars = await Car.selectRelated(where: "price<50000");
print(cars[0].manufacturer.name);