gpt4 book ai didi

mysql - 如何使用 quill 插入一对多对象?

转载 作者:可可西里 更新时间:2023-11-01 08:24:17 25 4
gpt4 key购买 nike

我有一个简单的 Parent 对象:

case class ParentCreate(name: String, age: Int, kids: Seq[String])

现在,在数据库中我有 2 个表来表示这个,perent 和 kid,因为 parent 可以有很多 child ,而在 kid 表中我有一个指向 parentId 的外键。

表的创建如下所示:

CREATE TABLE Parent (
parentId int NOT NULL AUTO_INCREMENT,
name varchar(255) NOT NULL,
age int NOT NULL,
PRIMARY KEY (parentId)
);

CREATE TABLE Kid (
kidId int NOT NULL AUTO_INCREMENT,
name: varchar(255) NOT NULL,
parentId int NOT NULL,
PRIMARY KEY (kidId),
FOREIGN KEY (parentId) REFERENCES Parent(parentId)
);

所以现在当我收到 ParentCreate 对象的请求时,我需要有另一层代表数据库结构的案例类,所以我需要转换 ParentCreate对象到 ParentKid 对象:

Parent(name: String, age: Int)

Kid(name: String)

因为这就是数据在数据库中建模的方式。

我的问题是我收到一个 ParentCreate 请求,但仍然没有 parentId,要插入 child ,我需要 child 的 parentId...

如何使用 quill 以最佳方式完成这项工作?

感谢任何帮助:)

最佳答案

这是我在项目中的做法:

case class KidId(value: Long) extends AnyVal
case class ParentId(value: Long) extends AnyVal

case class ParentRecord(id: ParentId
, name: String
, age: Int
)

case class Parent(id: ParentId
, name: String
, age: Int
)

object Parent {
def createNew(name: String, age: Int, id: ParentId = ParentId(0L)): Parent = {
Parent(id
, name
, age
)
}
}


case class KidRecord(
id: KidId
, parentId: ParentId
, name: String
)

case class Kid(
id: KidId
, parent: Parent
, name: String
)

object Kid {
def createNew(name: String, parent: Parent): Kid = {
Kid(KidId(0L)
, parent
, name
)
}
}

然后这是将放在不同包中的羽毛笔代码

def createParent(parent: Parent): ParentId = {
ctx.run(quote {
query[ParentRecord].insert (
_.name -> lift (parent.name)
, _.age -> lift (parent.age)
).returning (_.id)
}
)
}

def createKid(kid: Kid): KidId = {
ctx.run(quote {
query[KidRecord].insert(
_.name -> lift(kid.name)
, _.parentId -> lift(kid.parent.id)
).returning(_.id)
}
)
}

然后被这个 Controller 代码使用

def createParentController(name: String, age: Integer, kids: Seq[String]) = {
val parentToCreate = Parent.createNew(name, age)
val parentId = createParent(parentToCreate)
val createdParent = Parent.createNew(name, age, parentId)
for (kid <- kids) {
createKidController(kid, parentToCreate)
}
}

def createKidController(name: String, parent: Parent) = {
val kidToCreate = Kid.createNew(name, parent)
val kidId = createKid(kidToCreate)
}

最主要的是您需要先创建父对象,然后将父对象传递给您用来创建子对象的任何方法。警告:我对 Scala 和 Quill 还是很陌生。

关于mysql - 如何使用 quill 插入一对多对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48453112/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com