我有一组动态生成的参数,其形式类似
(def clauses {:apples 23 :plums 0 :bananas 7})
,我想在where
语句中使用它,所以它应该成为Korma查询的等效:
(select fruit-shop
(where (or {:apples 23}
{:plums 0}
{:bananas 7})))
生成映射列表非常简单:
(map #(apply array-map %)
(into [] clauses))
但是不能使用(or
语句应用于它,因为它是在宏展开时处理的,在clauses
绑定到它的值之前。
在这种情况下应该使用什么语句?
在熟悉了Korma源代码后,我发现korma.sql.fns/pred-or
函数取代了where
和having
中的or
语句。因此,我编写了以下辅助函数,它接受一个映射参数
(require '[korma.sql.fns :refer [pred-or]])
(defn or*
[m]
(apply pred-or
(map #(apply array-map %)
(into [] m))))
考虑到这一点,预期的查询将如下所示
(select fruit-shop
(where (or* clauses)))