Ответ 1
Использовать метод headOption
в Slick 3. *:
def findById(userId: Int): Future[Option[User]] ={
db.run(Users.filter(_.id === userId).result.headOption)
}
Я хочу запросить одну строку от пользователя на основе Id. У меня есть следующий фиктивный код
case class User(
id: Option[Int],
name: String
}
object Users extends Table[User]("user") {
def id = column[Int]("id", O.PrimaryKey, O.AutoInc)
def name = column[String]("name")
def * = id ~ name <>(User, User.unapply _)
def findById(userId: Int)(implicit session: Session): Option[User] = {
val user = this.map { e => e }.where(u => u.id === userId).take(1)
val usrList = user.list
if (usrList.isEmpty) None
else Some(usrList(0))
}
}
Мне кажется, что findById
является излишним, чтобы запросить один столбец, поскольку Id является стандартным первичным ключом. Кто-нибудь знает какие-то лучшие способы? Обратите внимание, что я использую Play! 2.1.0
Использовать метод headOption
в Slick 3. *:
def findById(userId: Int): Future[Option[User]] ={
db.run(Users.filter(_.id === userId).result.headOption)
}
Вы можете сбросить две строки из своей функции, переключившись с list
на firstOption
. Это будет выглядеть так:
def findById(userId: Int)(implicit session: Session): Option[User] = {
val user = this.map { e => e }.where(u => u.id === userId).take(1)
user.firstOption
}
Я считаю, что вы также выполнили бы свой запрос следующим образом:
def findById(userId: Int)(implicit session: Session): Option[User] = {
val query = for{
u <- Users if u.id === userId
} yield u
query.firstOption
}
firstOption
- путь, да.
Имея
val users: TableQuery[Users] = TableQuery[Users]
мы можем написать
def get(id: Int): Option[User] = users.filter { _.id === id }.firstOption
Более короткий ответ.
`def findById(userId: Int)(implicit session: Session): Option[User] = {
User.filter(_.id === userId).firstOption
}`
case class User(
id: Option[Int],
name: String
}
object Users extends Table[User]("user") {
def id = column[Int]("id", O.PrimaryKey, O.AutoInc)
def name = column[String]("name")
def * = id.? ~ name <>(User.apply _, User.unapply _)
// .? in the above line for Option[]
val byId = createFinderBy(_.id)
def findById(id: Int)(implicit session: Session): Option[User] = user.byId(id).firstOption