0

我想最好的(唯一?)方法是为嵌套结构创建一个单独的框,然后创建从父级(ONE)到子级(MANY)的关系。

但是,我的问题是如何实现.toObjectBox()将我的域数据模型转换为 ObjectBox 数据模型的方法。dartz 包中是否有类似Either的东西(返回左侧或右侧对象),它同时传输 2 个对象?

所以使用 ObjectBox 实体

@Entity()
class Customer {
  int id;
  @Backlink('customer')
  final orders = ToMany<Order>();
}

@Entity()
class Order {
  int id;
  final customer = ToOne<Customer>();
}

我会将父级(客户)与嵌套数据反对(订单)存储在 2 个相关框中

Customer customer = domainData.toObjectBox; // but how to get the order out?
customer.orders.add(Order('Order 1'));  // shouldn't this be Order(1)?
final customerId = store.box<Customer>().put(customer);

这就是我通常实现该toObjectBox方法的方式。在这里,您会看到这行不通,因为我必须将父级和嵌套的子级分开。虽然我想我可以用一些意大利面条来实现这一点,但我想知道是否有一种聪明的方法可以做到这一点,因为我想这应该是一种常见的模式(尽管我还没有找到任何关于它的问答)。

@Entity()
Customer {
  int id;
  List<Order> orders;
  Customer({required this.id, required this.orders});
  
  CustomerObox toObjectBox() {
    return CustomerObox(
      id: id,
//      orders: orders.map((x) => x.toObjectBox()).toList()
    );
}

=== 更新 ======================================

与此同时,我尝试自己创建一个回报结构,现在我正在努力让它发挥作用。

class Pair<T1, T2> {
  final T1 parent;
  final T2 child;
  Pair({required this.parent, required this.child});
}

@Entity()
class Customer {
  int id;
  List<Order> orders;
  Customer({required this.id, required this.orders});
      
  static Pair<CustomerObox, List<OrderObox>> toObjectBox(Customer cust) {
    Pair<CustomerObox, List<OrderObox>>(
        parent: CustomerObox(
                  id: cust.id,
                ),
        child: cust.orders.map((o) => o.toObjectBox()).toList()
    );
  }      
}
4

1 回答 1

0

所以我toObjectBox按照上面我的问题的更新所示实施。

在我的本地数据源实现中(我使用层:表示>业务逻辑(块)>域(模型,合同等)>存储库>数据源)我实现了以下方法

@override
  Future<void> storeCustomer(Customer customer) async {
    // Pair(T1 parent, T2 child) with T2 being List<OrderObox>
    final Pair customerObox = Customer.toObjectBox(customer);
    final CustomerObox customerParent = customerObox.parent;
    final List<OrderObox> customerChildren = customerObox.child;

    for (final child in customerChildren)
      customerParent.records.add(child);
    //  puts both, parent and children:
    final id = _sBox.put(customerParent);
  }
  @override
  Future<List<Customer>> getAllCustomers() async {
    final List<Customer> parents = [];
    final List<CustomerObox> parentsObox = await _sBox.getAll();
    for (final p in parentsObox) {
      final List<CustomerObox> childrenObox = p.records;
      parents.add(SessionJournalDto.fromObjectBox(p));
      for (final c in childrenObox)
        parents.last.records.add(Order.fromObjectBox(c));
    }
    return parents;

  }
于 2021-08-20T07:21:42.330 回答