灵活扩展方法的多对多版本

Many-to-Many version of a slick extension method

巧妙的 docs 展示了如何创建隐式扩展以获取 table 之间的关系:

implicit class PersonExtensions[C[_]](q: Query[People, Person, C]) {
  // specify mapping of relationship to address
  def withAddress = q.join(addresses).on(_.addressId === _.id)
}

如何使用多对多 table 而不是单一关系创建 withAddresses

例如,我希望能够执行与以下类似的操作,这是链接文档中单数示例的复数版本:

val chrisQuery: Query[People,Person,Seq] = people.filter(_.id === 2)
val addressesQuery: Query[Addresses,Address,Seq] = chrisQuery.withAddresses.map(_._2)
val addresses = db.run(addressQuery.result)

使用一些映射 table 例如 PersonAddresses

您只需从扩展开始的地方定义双精度类型,这是联合元组,例如:

 implicit class PersonExtensions[C[_]](q: Query[(People, Addresses), (Person, Address), C]) {
    def withCities = for {
      (people, address) <- q
      city <- Cities if address.cityCode === city.code
    } yield (people, address, city)
  }

然后你可以这样问:

  val addressesWithCitiesQuery = addressesQuery.withCities
  val addressesWithCities = db.run(addressesWithCitiesQuery.result)

这是基于 pimp my library 但设置为 Slick ... 其中输入是要扩展的值,您可以在此 post 中看到更多信息:https://danielasfregola.com/2015/06/08/pimp-my-library/