【问题标题】:Objectbox dart: how to filter based on a ToOne relation?Objectbox dart:如何根据 ToOne 关系进行过滤?
【发布时间】:2021-03-12 05:32:15
【问题描述】:

假设我有

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

@Entity()
class Item {
  int id;
  int price;
  @Backlink()
  final orders = ToMany<Order>();
}

如何根据商品价格查询过滤订单。我知道我可以查询商品并获取反向链接订单,但是否有可能反过来呢?例如:

final orders = store.box<Order>().query(Order_.item.price < 100).build(). 

docs 表示即使跨关系过滤数据,但我找不到方法。

【问题讨论】:

    标签: flutter dart objectbox


    【解决方案1】:

    要根据您的型号的商品价格查询订单,您可以使用以下命令:

    final ordersQuery = store.box<Order>().query()
      ..link(Order_.item, Item_.price < 100)
      ..build();
    

    它的作用是:

    • 首先创建一个没有条件的QueryBuilder&lt;Order&gt;query() 没有参数)
    • 然后创建一个指向 Item 的链接(如果我们想深度链接另一个实体,它会创建另一个查询构建器,在这种情况下我们不会这样做)
    • 然后在“根”QueryBuilder 上调用build(),创建Query&lt;Order&gt;

    前面的代码相当于:

    final ordersQueryBuilder = store.box<Order>().query();
    ordersQueryBuilder.link(Order_.item, Item_.price < 100);
    final ordersQuery = ordersQueryBuilder.build();
    

    然后,对于任一版本的代码,您都可以照常使用查询:

    final orders = ordersQuery.find();
    
    // As usual, don't forget to close the query to free up resources when you don't
    // need it anymore. In case you missed it, queries are reusable so you can call 
    // as many functions on ordersQuery as needed (it will work until you close()).
    ordersQuery.close();
    

    【讨论】:

    • 谢谢。那行得通。您将如何处理深层链接?喜欢按项目类别进一步过滤吗?
    • 刚刚为我工作:ordersQueryBuilder.link(Order_.item, Item_.price > 多么棒的图书馆
    • 是的,这正是你可以深度链接的方式:)
    • 我还建议查看测试代码以了解可以使用该库的其他方式(Dart 的文档仍然有点稀缺):github.com/objectbox/objectbox-dart/tree/main/objectbox/test
    • 为了清楚起见,在您的深层链接示例中,您实际上不必链接,因为您有 ID - 这是相同的:ordersQueryBuilder.link(Order_.item, Item_.category.equals(id).and(Item_.price &lt; 100))
    猜你喜欢
    • 1970-01-01
    • 2021-10-06
    • 1970-01-01
    • 1970-01-01
    • 2022-01-05
    • 2019-10-09
    • 1970-01-01
    • 1970-01-01
    • 2022-08-08
    相关资源
    最近更新 更多