构建where子句?
Building where clauses?
我希望能够为查询构建 where 子句。我想输入一组 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循环会复制查询对象。是否可以合并这些对象或您可以推荐的其他方法来实现所需的输出?
conditions
的 合并 到一个查询映射中可以使用 reduce
:
(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))
只要条件的键是唯一的,我就建议这样做。
我希望能够为查询构建 where 子句。我想输入一组 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循环会复制查询对象。是否可以合并这些对象或您可以推荐的其他方法来实现所需的输出?
conditions
的 合并 到一个查询映射中可以使用 reduce
:
(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))
只要条件的键是唯一的,我就建议这样做。