나는 다음과 같은 스칼라/슬릭/PlayFramework 코드가 있습니다슬릭 쿼리 최적화
class UserRepository @Inject()(dbConfigProvider: DatabaseConfigProvider, loginInfoRepository: LoginInfoRepository) extends BaseRepository[UserTable, User](TableQuery[UserTable], dbConfigProvider.get[JdbcProfile].db) with UserQuery {
val db = dbConfigProvider.get[JdbcProfile].db
def findUserByProviderIdAndKey(providerId: String, providerKey: String): Future[User] = {
for {
maybeLoginInfo <- loginInfoRepository.findByProviderIdAndProviderKey(providerId, providerKey)
maybeUser <- db.run(query.filter(_.loginId === maybeLoginInfo.loginId).result.head) //query refers to the user table with a loginId column
} yield maybeUser
}
사용자 테이블과 login_info 테이블을 쿼리합니다. user 테이블은 login_info 테이블에 외래 키를 가지고있다.
현재 findByProviderIdAndProviderKey
메서드는 Future[LoginInfo]
을 반환합니다. 그러나 존재하지 않는 사용자 ID에 대해 Future[Option[LoginInfo]]
을 반환하도록 변경하고 싶습니다. findByProviderIdAndProviderKey
메서드에서 쉽게 변경할 수 있지만 옵션 값을 처리하기 위해 이해를 변경하는 방법을 잘 모르겠습니다.
가 나는 아래처럼 뭔가를 위해 할 수있는 것 같아요 (리팩토링을 필요로) :
class UserRepository @Inject()(dbConfigProvider: DatabaseConfigProvider, loginInfoRepository: LoginInfoRepository) extends BaseRepository[UserTable, User](TableQuery[UserTable], dbConfigProvider.get[JdbcProfile].db) with UserQuery {
val db = dbConfigProvider.get[JdbcProfile].db
def findUserByProviderIdAndKey(providerId: String, providerKey: String): Future[User] = {
loginInfoRepository.findByProviderIdAndProviderKey(providerId, providerKey).map{
case (Some(x)) => db.run(query.fitler(_.loginId == x.loginInd).result.headOption)
case None=> Option(None)
}
을 지금, 나는 다음과 같은 질문이 있습니다
어떻게 쿼리는 값을 반환하지 다루는 것을 주어진 검색어? 예를 들어 로그인 정보가 테이블에 없으면? 나는 그것을 올바르게하고 있는가? 아니면 더 좋은 방법이 있습니까?
나는 슬릭이
Option
의 값을 자동으로 조인한다고 생각 하겠지만 그렇지 않은 것처럼 보입니다.Option
값이 해제되지 않는 이유는 무엇입니까?위의 내용을 두 개의 SQL 쿼리와 데이터베이스 호출로 변환 할 수 있습니까? 그렇다면 올바른 구조로 데이터베이스 호출을 하나만 발행하도록 구조를 어떻게 다시 구성합니까?
미리 감사드립니다.
당신의 질문이 당신의'findByProviderIdAndProviderKey' 메소드에 관한 것이므로, 이것을위한 코드를 게시 할 수 있습니까? – thwiegan