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');
      },
    );