SwiftData 如何使用一对多模型形成搜索谓词

Dav*_*vid 5 predicate swift-data

我正在 Xcode 15(测试版)中迁移到 SwiftData,并且很难弄清楚如何在我的一对多模型中形成谓词。期望的结果是返回一个查询,该查询仅返回文章“搜索”字段包含用户正在搜索的字符串的文章和部分。

这是我当前的模型:

@Model
class SectionsSD {    
  @Attribute(.unique) var id: String
  var section: String
  var rank: String  
  var toArticles: [ArticlesSD]?
    
  init(id:String, section: String, rank: String) {
      self.id = id
      self.section = section
      self.rank = rank
  }
}
@Model
class ArticlesSD {
  var id: String
  var title: String
  var summary: String
  var search: String
  var section: String
  var body: String
  @Relationship(inverse: \SectionsSD.toArticles) var toSection: SectionsSD?
 
  init(id: String, title: String, summary: String, search: String, section: String, body: String) {
    self.id = id
    self.title = title
    self.summary = summary
    self.search = search
    self.section = section
    self.body = body
  }
}
Run Code Online (Sandbox Code Playgroud)

在 CoreData 中,我能够在代码中执行以下操作来传递搜索谓词(过滤器是用户输入的搜索文本):

  _fetchRequest = FetchRequest<SectionsEntity>(sortDescriptors: [SortDescriptor(\.rank)], predicate: NSPredicate(format: "toArticles.search CONTAINS %@", filter))
Run Code Online (Sandbox Code Playgroud)

我如何到达“toArticles.search”?显然,使用 SwiftData 中的新模型/结构/关系,我无法弄清楚如何形成谓词来实现与以前相同的结果。下面是我尝试过的,但 Xcode 不喜欢它。

  let searchPredicate = #Predicate<SectionsSD> { $0.toArticles?.contains(filter) }
  _fetchRequest = Query(filter: searchPredicate)
Run Code Online (Sandbox Code Playgroud)

任何有关如何形成该谓词的建议和示例将不胜感激。

kpr*_*ter 0

您可以尝试嵌套查询

 let predicate = #Predicate< SectionsSD > {
    $0.toArticles?.contains {
        $0.search.contains(filter)
    }
}
Run Code Online (Sandbox Code Playgroud)