如果一个产品可以有多种颜色和尺寸,并且每种颜色和尺寸可以有多种颜色,那么您需要两个表格。一种将颜色与产品联系起来,另一种将尺寸与产品联系起来。
这是您仅提及其中一种关系的示例:https ://moor.simonbinder.eu/docs/examples/relationships/
所以现在用两个来做。(随意更改表格名称以获得更合适的名称)
带颜色的产品表:
class ProductsColors extends Table{
IntColumn get idProductsColors => integer().autoIncrement()();
IntColumn get Product => integer()();
IntColumn get Color => integer()();
}
产品尺寸表:
class ProductsSizes extends Table{
IntColumn get idProductsColors => integer().autoIncrement()();
IntColumn get Product => integer()();
IntColumn get Size => integer()();
}
要为产品添加颜色或尺寸,只需创建具有正确 ID 的实体并将其添加到数据库中。
要选择特定组的颜色,请使用 id "idProductX":
final SimpleSelectStatement<Colors, Color> colorQuery =
select(colors)
..join(<Join<Table, DataClass>>[
innerJoin(
productsColors,
productsColors.Color.equalsExp(colors.idColor) &
productsColors.Product.equals(idProductX),
),
]);
List<Colors> = colorQuery.get();
大小应该有一个等价物。告诉我它是否适合你。
为了额外的安全性,您应该使 int 引用其他表的外键,如下所示:
class ProductsColors extends Table{
IntColumn get idProductsColors => integer().autoIncrement()();
IntColumn get Product => integer()().customConstraint('REFERENCES products(idProduct)')();
IntColumn get Color => integer()().customConstraint('REFERENCES colors(idColor)')();
}
但是您需要在数据库服务中添加它以激活外键:
@override
MigrationStrategy get migration =>
MigrationStrategy(
beforeOpen: (OpeningDetails details) async {
await customStatement('PRAGMA foreign_keys = ON');
},
);