Dart (沼地颤振)单个实体中的多个关系
我试图建立两种关系:Dart (沼地颤振)单个实体中的多个关系,dart,flutter-moor,Dart,Flutter Moor,我试图建立两种关系: 产品颜色 产品尺寸 产品表: class Products extends Table{ IntColumn get idProduct => integer().autoIncrement()(); //more fields... } 颜色表: class Colors extends Table { IntColumn get idColor => integer().autoIncrement()(); TextColumn g
- 产品颜色
- 产品尺寸
class Products extends Table{
IntColumn get idProduct => integer().autoIncrement()();
//more fields...
}
颜色表:
class Colors extends Table {
IntColumn get idColor => integer().autoIncrement()();
TextColumn get name => text().withLength(min: 1, max: 100)();
TextColumn get value => text().withLength(min: 1, max: 100)();
}
尺寸表:
class Sizes extends Table {
IntColumn get idSize => integer().autoIncrement()();
TextColumn get size => text().withLength(min: 1, max: 100)();
}
产品可以有多种尺寸和颜色
我已经阅读了moor文档,但只找到了具有一个关系的实体的示例。使用查询解决
首先,添加事务表:
class ProductsWithColors extends Table{
IntColumn get idProductWithColor => integer().autoIncrement()();
IntColumn get product => integer()();
IntColumn get color => integer()();
}
class ProductsWithSizes extends Table{
IntColumn get idProductWithSize => integer().autoIncrement()();
IntColumn get product => integer()();
IntColumn get size => integer()();
}
然后,为查询创建一个Dao
@UseDao(tables: [Products, Colors, ProductsWithColors, ProductsWithSizes, Sizes],
queries: {
'productsWithSizesAndColors':
'SELECT * FROM products INNER JOIN products_with_colors ON
products_with_colors.product = products.id_product INNER JOIN
colors ON colors.id_color = products_with_colors.color
INNER JOIN products_with_sizes ON products_with_sizes.product = products.id_product
INNER JOIN sizes ON sizes.id_size = products_with_sizes.size
WHERE <condition> = :idc'
}
)
@UseDao(表:[产品、颜色、产品颜色、产品尺寸、尺寸],
查询:{
“具有大小和颜色的产品”:
'选择*从产品内部连接产品,\u并启用\u颜色
products\u带有\u颜色。product=products.id\u产品内部连接
colors.id_color=带有_colors.color的产品
带尺寸的产品上带尺寸的内部连接产品。产品=产品。id\U产品
sizes.id_size上的内部联接尺寸=带有_sizes.size的产品
其中=:idc'
}
)
这将生成以下方法:
Future<List<ProductsWithSizesAndColorsResult>> productsWithSizesAndColors(int idc) {
return productsWithSizesAndColorsQuery(idc).get();
}
Stream<List<ProductsWithSizesAndColorsResult>> watchProductosWithSizesAndColors(int idc) {
return productsWithSizesAndColorsQuery(idc).watch();
}
具有大小和颜色的未来产品(国际数据中心){
返回具有大小和颜色的产品(idc).get();
}
流式监视产品,带有大小和颜色(int idc){
返回大小和颜色相同的产品(idc).watch();
}
insert方法是这样的:
Future insertProductWithSizesAndColors async(List<Color> colors, List<Size> sizes, Product product){
colors.forEach((c) async {
await db.colorsDao.insertColor(ColorsCompanion(idColor: moor.Value(c.idColor), ..);
var pwc = ProductsWithColorsCompanion(color: moor.Value(c.idColor), product: moor.Value(product.idProduct));
await db.productsWithColorsDao.insertProductWithColor(pwc);
});
sizes.forEach((t) async {
await db.sizesDao.insertSize(SizesCompanion(idSize: moor.Value(t.idSize),..);
var pwt = ProductsWithSizesCompanion(size: moor.Value(t.idSize),product: moor.Value(product.idProduct));
await db.productsWithSizesDao.insertProductWithSize(pwt);
});
await db.productsDao.insertProduct(ProductsCompanion(idProduct: moor.Value(product.idProduct),..));
});
}
Future insertProductWithSizesAndColors异步(列表颜色、列表大小、产品){
colors.forEach((c)异步{
等待db.colorsDao.insertColor(ColorsCompanion(idColor:moor.Value)(c.idColor),…);
var pwc=产品颜色公司(颜色:摩尔值(c.idColor),产品:摩尔值(product.idProduct));
等待db.productsWithColorsDao.insertProductWithColor(pwc);
});
大小。forEach((t)异步{
等待db.sizesDao.insertSize(sizecompanion(idSize:moor.Value(t.idSize),…);
var pwt=ProductsWithSizesCompanion(大小:moor.Value(t.idSize),产品:moor.Value(product.idProduct));
等待db.productsWithSizesDao.insertProductWithSize(pwt);
});
等待db.productsDao.insertProduct(ProductsCompanion(idProduct:moor.Value(product.idProduct),…);
});
}
如果一个产品可以有多种颜色和尺寸,并且每种颜色和尺寸可以有多种颜色,那么您需要两个表。一个表用于将颜色与产品链接,另一个表用于将尺寸与产品链接
这是您提到的仅涉及其中一种关系的示例:
现在就用两个来做吧。(请随意更改表格名称以获得更合适的名称)
使用颜色的产品列表:
class ProductsColors extends Table{
IntColumn get idProductsColors => integer().autoIncrement()();
IntColumn get Product => integer()();
IntColumn get Color => integer()();
}
表1-1:尺寸不同的产品:
class ProductsSizes extends Table{
IntColumn get idProductsColors => integer().autoIncrement()();
IntColumn get Product => integer()();
IntColumn get Size => integer()();
}
要为产品添加颜色或大小,只需使用正确的ID创建实体并将其添加到数据库中
要选择特定组的颜色,请使用id“idProductX”执行此操作:
但您需要在数据库服务中添加此项以激活外键:
@override
MigrationStrategy get migration =>
MigrationStrategy(
beforeOpen: (OpeningDetails details) async {
await customStatement('PRAGMA foreign_keys = ON');
},
);
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');
},
);