【发布时间】:2020-04-19 06:10:34
【问题描述】:
我有一个光滑的 scala 项目。 我有两个表用户和用户设备: 表之间的关系是一对多的
CREATE TABLE "user"
(
id UUID NOT NULL,
name VARCHAR NOT NULL,
surname VARCHAR NOT NULL
);
CREATE TABLE user_devices
(
id UUID NOT NULL,
user_id UUID NOT NULL,
device_name VARCHAR,
device_model VARCHAR
);
我需要在 slick 中做这样的查询:
SELECT * FROM audience.user as u
JOIN user_devices on(u.id=user_devices.user_id)
where (device_name = 'Samsung' and device_model = 'A20')
OR device_name = 'Xaomi'
;
这是我的 scala 代码
object 示例扩展 App {
case class UserRow(id: UUID, name: String, surname: String)
case class UserDevices(id: UUID,
userId: UUID,
deviceName: Option[String],
deviceModel: Option[String])
case class Params(deviceName: Option[String], deviceModel: Option[String])
case class FilterBy(params: Option[List[Params]])
final class UserTable(tag: Tag) extends TableUserRow {
def id = column[UUID]("id")
def name = column[String]("name")
def surname = column[String]("surname")
def * = (id, name, surname).mapTo[UserRow]
}
最终类 UserDevicesTable(tag: Tag) 扩展 TableUserDevices {
def id = column[UUID]("id")
def userId = column[UUID]("user_id")
def name = column[Option[String]]("device_name")
def model = column[Option[String]]("device_model")
def * = (id, userId, name, model).mapTo[UserDevices]
}
def filter(filterBy: FilterBy): Future[Seq[UserRow]] = {
val query = userTable
.joinLeft(userDevicesTable)
.on(_.id === _.userId)
.filterOpt(filterBy.params) {
case ((user: UserTable, userDevice: Rep[Option[UserDevicesTable]]),
params:Seq[Params]) =>
???
}
.map(_._1)
.result
db.run(query)
}
}
如何在 Params obj 之间使用 Or 进行过滤,以及如何使用 AND 在 Param obj 中的参数之间进行过滤? 有什么建议吗?
【问题讨论】: