0

我正在尝试建立两种关系:

  • 产品x颜色
  • 产品x尺寸

产品表:

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 文档,但只找到了具有一种关系的实体的示例。

4

2 回答 2

0

如果一个产品可以有多种颜色和尺寸,并且每种颜色和尺寸可以有多种颜色,那么您需要两个表格。一种将颜色与产品联系起来,另一种将尺寸与产品联系起来。

这是您仅提及其中一种关系的示例: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');
      },
    );
于 2020-10-05T01:20:40.303 回答
0

使用查询解决。

首先,添加事务表:

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

这会生成以下方法:

Future<List<ProductsWithSizesAndColorsResult>> productsWithSizesAndColors(int idc) {
  return productsWithSizesAndColorsQuery(idc).get();
}

Stream<List<ProductsWithSizesAndColorsResult>> watchProductosWithSizesAndColors(int idc) {
  return productsWithSizesAndColorsQuery(idc).watch();
}

插入方法是这样的:

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),..));
  });
}
于 2020-10-05T00:34:36.700 回答