之前我们看过了透过 DAO 方式,来处理资料之间呈现一对多关联,或者多对多关联的做法。
今天我们来看看,如果资料是呈现 Parent-Child reference 时,我们该怎麽利用 Exposed 框架处理
根据官方文件的说法
Parent-child reference is very similar to many-to-many version, but an intermediate table contains both references to the same table.
简单的说,其实就是资料的多对多关系,只是关联的对象变成了同一类别的内容而已。
比方说,之前我们提到多对多关系时,使用的范例是 user
和 tag
。如果我们想要建立的,是 user
和 user
之间的多对多关系,那就变成得用 Parent-Child reference 来处理了。
我们用以下的方式来调整 user
资料表和 DAO 物件
object Users : IntIdTable() {
val name = varchar("name", 50)
}
object UsersToUsers : Table() {
val parent = reference("parent_user_id", Users)
val child = reference("child_user_id", Users)
}
class User(id: EntityID<Int>) : IntEntity(id) {
companion object : IntEntityClass<User>(Users)
var name by Users.name
var parents by User.via(UsersToUsers.child, UsersToUsers.parent)
var children by User.via(UsersToUsers.parent, UsersToUsers.child)
}
类似多对多关系时所使用的中间表,我们藉由宣告 UsersToUsers
中间表,来记录 User
之间的关联。
宣告之後,我们就可以用物件的逻辑,来记录每个 user
对应的 parents
和 children
了
SchemaUtils.create(Users)
SchemaUtils.create(UsersToUsers)
val alice = User.new {
name = "Alice"
}
val bob = User.new {
name = "Bob"
}
val carol = User.new {
name = "Carol"
}
bob.parents = SizedCollection(listOf(alice))
carol.parents = SizedCollection(listOf(alice, bob))
这样宣告後,我们可以取出纪录的 parents
关联,比方说
carol.parents.forEach { println(it.name) }
这样会取得
Alice
Bob
除了可以透过 bob
和 carol
取得对应的 parents
,还可以反过来透过 alice
物件找出对应的 children
有哪些
alice.children.forEach { println(it.name) }
这样会取得
Bob
Carol
利用 Parent-Child reference 的方式,我们可以用更加直觉的写法,来实现资料之间的关联。进而可以透过资料库,来纪录树状结构的资料呈现。
<<: day2 CCNA - switch (雷)这东西不简单
>>: [Day 1] 身为一名普通 iOS 开发者所需的程序知识 Intro
https://typeorm.io/#/repository-api 常常在使用,但也只有使用到其...
说起特斯拉,相信近期大家都比较关注其品牌下电动汽车多次发生事故的新闻,虽然如今看似风波已经过去,但特...
**** -资料来源:https : //panoply.io/data-warehouse-gui...
我很肤浅,又爱慕虚荣,曾经一心追求网页载入速度 所幸,运气向来不错,总是能殊途同归压对宝? 虽然说,...
下图演示了针对生物识别系统的九个攻击点。从传感器到特徵提取器的生物特徵数据的回放是其中之一。 . “...