我希望能够构建查询的Where子句。我想输入一系列条件并使用Korma构建查询,如下所示:
(defn ^:private fetch-by
"Append conditions to the query."
[query ^clojure.lang.PersistentVector conditions]
(for [condition conditions]
(if (instance? clojure.lang.PersistentArrayMap condition)
(korma/where query condition) query)))
但是,这里的for循环将复制查询对象。是否可以合并这些对象或您可以建议可以实现所需输出的另一种方法?
可以使用 reduce
:
conditions
的合并 (defn ^:private fetch-by
"Append conditions to the query."
[query conditions]
(->> (filter map? conditions)
(reduce (fn [query condition]
(korma/where query condition))
query)))
在这里,您的初始reduce
状态是您传递的任何query
,而还原功能(和korma/where
(照顾将每个条件合并到查询地图中。
(-> (korma/select* :my-table)
(fetch-by [{:active true}
{:deleted false}])
(korma/as-sql))
=> "SELECT "my-table".* FROM "my-table" WHERE ("my-table"."active" = ?) AND ("my-table"."deleted" = ?)"
但是,这与仅通过一张带有多个条目的单个地图到korma/where
:
(-> (korma/select* :my-table)
(korma/where {:active true
:deleted false})
(korma/as-sql))
我建议只要条件的键是唯一的。