Objectbox dart:如何根据 ToOne 关系进行过滤?

问题描述

假设我有

@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 表示即使跨关系过滤数据,但我找不到办法做到这一点。

解决方法

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

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

这样做的目的是:

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

前面的代码等价于:

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();