我正在使用Scala,並且新增了Play和Slick。我開始阻止一個簡單的數據庫結構,我不確定處理外鍵和投影的正確方法。在頁面底部的示例中,它目前不編譯,因爲ForeignKey無法直接解除,那麼將查詢結果提升到我的類型(基本上這是無法使用的方法和附加構造函數)的正確方法是什麼:在Scala-Slick中輸入外鍵
case class UserCompanyPermission(pk: UUID, company: Company, user: User, accessLevel: CompanyPermissionLevel)
要麼我想要類型投影返回一個UserCompanyPermission,否則有一種方法來包裝一切進出DAO方法,所以從外面我只是通過我的Scala類型。基本上我想確保我的業務邏輯完全與狀態分離,使測試變得更加容易,因此能夠將所有表格細節都限制在這個存儲包中。是他們的包裝方式,還是我在DAO對象中編寫的每種方法都需要自行進行轉換?
trait CompaniesComponent { this: UsersComponent =>
val Companies: Companies
val UserCompanyPermissions: UserCompanyPermissions
implicit val companyPermissionLevelTypeMapper = MappedTypeMapper.base[CompanyPermissionLevel.Value, Int](
{ level => level.id }, { id => CompanyPermissionLevel(id) }
)
class Companies extends Table[Company]("Company") {
def pk = column[UUID]("pk", O.PrimaryKey)
def subdomain = column[String]("subdomain", O.NotNull)
def name = column[String]("name", O.NotNull)
def * = pk ~ subdomain ~ name <> (Company.apply _, Company.unapply _)
}
class UserCompanyPermissions extends Table[UserCompanyPermission]("UserCompanyPermission") {
def pk = column[UUID]("pk", O.PrimaryKey)
def company_pk = column[UUID]("company_pk", O.NotNull)
def user_pk = column[UUID]("user_pk", O.NotNull)
def accessLevel = column[CompanyPermissionLevel.Value]("access_level", O.NotNull)
def company = foreignKey("company_pk", company_pk, Companies)(_.pk)
def user = foreignKey("user_pk", user_pk, Users)(_.pk)
def * = pk ~ company ~ user ~ accessLevel <> (UserCompanyPermission.apply _, UserCompanyPermission.unapply _)
}
}
object Companies extends DAO {
def insert(company: Company)(implicit session: Session) {
Companies.insert(company)
}
}
object UserCompanyPermissions extends DAO {
def insert(perm: UserCompanyPermission)(implicit session: Session) {
UserCompanyPermissions.insert(perm)
}
}
此外,我知道這個問題,但它並沒有真正詳細說明什麼是正確的設計方法,將保持乾燥。 http://stackoverflow.com/questions/17830492/how-to-use-slicks-mapped-tables-with-foreign-keys – MalucoMarinero