灵活扩展方法的多对多版本
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/
巧妙的 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/