首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在moor_flutter中获得聚合数据?

如何在moor_flutter中获得聚合数据?
EN

Stack Overflow用户
提问于 2021-06-15 17:58:52
回答 2查看 233关注 0票数 0

假设我有两个简单的表-- UsersOrders

  • Users有列Id
  • Orders有列IdUserId

如何使用moor_flutter轻松获取用户的所有订单,并将其作为以下模型的流返回?

代码语言:javascript
复制
class UserModel {
  final String id;
  final List<OrderModel> orderModels;

  UserModel(this.id, this.orders);
}

class OrderModel {
  final String id;

  OrderModel(this.id);
}

是正式的文档,但是它没有涵盖这个用例。

与EFCore和C#等效的调用将是:

代码语言:javascript
复制
public async Task<IEnumerable<UserModel>> GetUserOrders(String userId)
{
    return await _db.Users
        .Include(user  => user.Orders)
        .Where(user => user.Id == userId)
        .Select(user => new UserModel
        {
            Id = user.Id,
            OrderModels = user.Orders.Select(order => new OrderModel
            {
                Id = null,
            }).ToList()
        })
    .ToListAsync();
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-07-27 20:12:21

这似乎是一种棘手的解决方案,但我最终所做的是创建了两个名为HabitWithLogsHabitModel的类。我将查询结果放入HabitWithLogs实例中,然后将它们分组到HabitModel实例中。

数据类:

代码语言:javascript
复制
class HabitWithLog {
  final Habit habit;
  final HabitLog? habitLog;

  HabitWithLog({required this.habit, required this.habitLog}) : assert(habitLog == null || habitLog.habitId == habit.id);
}

class HabitModel {
  final Habit habit;
  final List<HabitLog> habitLogs;

  HabitModel({required this.habit, required this.habitLogs});
}

Dao方法:

代码语言:javascript
复制
Future<List<HabitModel>> getAllHabits() async {
  // Get habits and order
  final query0 = (_db.select(_db.habits)..orderBy([(t) => OrderingTerm(expression: t.order, mode: OrderingMode.asc)]));

  // Join with habit logs
  final query1 = query0.join([
    leftOuterJoin(_db.habitLogs, _db.habitLogs.habitId.equalsExp(_db.habits.id)),
  ]);

  // Naive way that return the same habit multiple times
  final hwlList = query1.map((rows) => HabitWithLog(
        habit: rows.readTable(_db.habits),
        habitLog: rows.readTableOrNull(_db.habitLogs),
      ));

  // Group hwlList by habits
  final groups = (await hwlList.get()).groupListsBy((hwl) => hwl.habit);

  // Map grouping
  return groups.entries
      .map((group) => HabitModel(
            habit: group.key,
            habitLogs: (group.value[0].habitLog == null) ? List<HabitLog>.empty() : group.value.map((hwl) => hwl.habitLog!).toList(),
          ))
      .toList();
}

映射流感觉很糟糕,不应该是实现这一目标的唯一途径。

票数 0
EN

Stack Overflow用户

发布于 2021-07-24 12:55:28

我最近遇到了同一问题。根据文档中给定的示例,我对使用Joins感到困惑。

我所做的是:

创建的类(仅在数据库文件中)。(参见下面的示例),它有两个要连接的对象(组合)。我在一个数据库类中编写了查询。

您将通过示例获得更好的理解:

代码语言:javascript
复制
@UseMoor(
  tables: [OfflineProductMasters, OfflineProductWiseStocks],
)
class MyDatabase extends _$MyDatabase {
  // we tell the database where to store the data with this constructor
  MyDatabase() : super(_openConnection());

  // you should bump this number whenever you change or add a table definition. Migrations
  // are covered later in this readme.

  @override
  int get schemaVersion => 1;

  Future<List<ProductWithStock>> getProductWiseStock(String searchString, int mappingOfflineSalesTypeId) async {
    try {
      final rows = await (select(offlineProductMasters).join([innerJoin(offlineProductWiseStocks, offlineProductMasters.itemId.equalsExp(offlineProductWiseStocks.itemId))])
        ..where(offlineProductWiseStocks.salesTypeId.equals(mappingOfflineSalesTypeId) & offlineProductMasters.productName.like('$searchString%'))
        ..limit(50)
      ).get();
      return rows.map((row) {
        return ProductWithStock(
          row.readTable(offlineProductMasters),
          row.readTableOrNull(offlineProductWiseStocks),
        );
      }).toList();
    }catch(exception){
      print(exception);
      return Future.value([]);
    }
  }
}

class ProductWithStock {
  final OfflineProductMaster offlineProductMaster;

  final OfflineProductWiseStock? productWithStock;

  ProductWithStock(this.offlineProductMaster, this.productWithStock);
}

现在,您得到了如何使用这种查询的结构。希望您能以这种方式编写查询。

我不知道你是否解决了这个问题。如果解决了,请张贴答案,以便其他人可以得到帮助。

谢谢。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67991332

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档