【问题标题】:Many-to-Many version of a slick extension method一个灵活的扩展方法的多对多版本
【发布时间】:2019-08-12 12:53:53
【问题描述】:

光滑的docs 展示了如何创建一个隐式扩展来获取表之间的关系:

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

如何使用多对多表而不是单个关系创建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)

使用一些映射表,例如PersonAddresses

【问题讨论】:

    标签: playframework slick


    【解决方案1】:

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

     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,但设置为 Slick ... 其中输入是要扩展的值,您可以在这篇文章中看到更多信息:https://danielasfregola.com/2015/06/08/pimp-my-library/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-11-02
      • 1970-01-01
      • 1970-01-01
      • 2019-03-09
      • 1970-01-01
      • 1970-01-01
      • 2015-01-24
      相关资源
      最近更新 更多