目標是使用可選關鍵字和/或shopId過濾項目。使用Slick 2.1.0構建動態查詢
如果沒有定義它們,則應返回所有項目。
我的嘗試是
case class ItemSearchParameters(keywords: Option[String], shopId: Option[Long])
def search(params: ItemSearchParameters): Either[Failure, List[Item]] = {
try {
db withDynSession {
val q = Items.query
if (params.keywords.isDefined) {
q.filter { i =>
((i.title like "%" + params.keywords + "%")
|| (i.description like "%" + params.keywords + "%"))
}
}
if (params.shopId.isDefined) {
q.filter { i =>
i.shopId === params.shopId
}
}
Right(q.run.toList)
}
} catch {
case e: SQLException =>
Left(databaseError(e))
}
}
params.keywords或params.ShopId這個函數返回的所有項目。有人可以解釋什麼是錯的?
更新:第二次嘗試
def search(params: ItemSearchParameters): Either[Failure, List[Item]] = {
try {
db withDynSession {
var q = Items.query
q = params.keywords.map{ k => q.filter(_.title like "%" + k + "%")} getOrElse q
q = params.keywords.map{ k => q.filter(_.description like "%" + k + "%")} getOrElse q
q = params.shopId.map{ sid => q.filter(_.shopId === sid)} getOrElse q
Right(q.run.toList)
}
} catch {
case e: SQLException =>
Left(databaseError(e))
}
}
對於第二次嘗試該怎麼辦(標題或說明)如果關鍵字isDefined?
更新:如果關鍵字給出
謝謝,我只是試圖使用它,但我無法使它與標題或關鍵字一起工作。請參閱我的問題中的第三次嘗試:) – arsenik 2014-11-22 14:09:01
哦,我明白了,必須查看生成的查詢。) – DaunnC 2014-11-22 18:26:54