多对多查询加入渡槽

Many to many query joins in aqueduct

我在 2 个 ManagedObject(A 和 B)之间有 A -> AB <- B 多对多关系,其中 AB 是连接点 table。

从数据库中查询 A 时,如何将 B 值连接到 AB 联合对象?

Query<A> query = await Query<A>(context)
    ..join(set: (a) => a.ab);

它给了我一个包含 AB 关节对象的 A 对象列表,但是 AB 对象不包含完整的 B 对象,而只包含 b.id(不包含来自 class B 的其他字段)。

干杯

当您调用 join 时,会创建一个新的 Query<T> 并从该方法返回,其中 T 是连接类型。因此,如果 a.abAB 类型,Query<A>.join returns a Query<AB> (它在内部链接到原始查询)。

由于您有一个新的 Query<AB>,您可以像配置任何其他查询一样配置它,包括启动另一个连接、添加排序描述符和 where 子句。

需要做出一些风格语法选择。您可以将此查询压缩为一行:

final query = Query<A>(context)
    ..join(set: (a) => a.ab).join(object: (ab) => ab.b);
final results = await query.fetch();

如果查询保持原样,这是可以的,但是随着您向查询添加更多条件,点运算符和级联运算符之间的区别变得更难跟踪。我经常将连接查询拉到它自己的变量中。 (请注意,您不要在连接查询上调用任何执行方法):

final query = Query<A>(context);
final join = query.join(set: (a) => a.ab)
  ..join(object: (ab) => ab.b);
final results = await query.fetch();