☰
Current Page
Main Menu
Home
Home
Editing
10.Filter过滤条件
Edit
Preview
h1
h2
h3
default
Set your preferred keybinding
default
vim
emacs
markdown
Set this page's format to
AsciiDoc
Creole
Markdown
MediaWiki
Org-mode
Plain Text
RDoc
Textile
Rendering unavailable for
BibTeX
Pod
reStructuredText
Help 1
Help 1
Help 1
Help 2
Help 3
Help 4
Help 5
Help 6
Help 7
Help 8
Autosaved text is available. Click the button to restore it.
Restore Text
--- title: Filter过滤条件 date: 2023-09-25 17:31:35 permalink: /pages/107af7/ --- ### Filter过滤条件 #### 1. filter表达式 filter表达式:通常用来筛选数据记录。它们使用波兰表示法语法,以便于将它们解析后生成对应的SQL WHERE数据库筛选语句。 filter通常为一个数组,数组元素为过滤条件,每个条件是一个三元表达式,例如:`["&",["state","=","confirm"],["user_id","in",[1,2,3]]]` filter多个条件的逻辑运算使用了“波兰表示法”,波兰表示法的特定是操作符置于操作数前,运算顺序为:从左至右读入表达式,遇到一个操作符后跟随两个操作数时,则计算之,然后将结果作为操作数替换这个操作符和两个操作数;重复此步骤,直至所有操作符处理完毕。 #### 2. filter的写法 filter表达式是一个条件列表,每个条件是一个形如`[["field_name", "operator", value]]`的双重数组。 > filed_name 是需要筛选的字段,它可以使用点(.)来访问关系模块的字段。 > value 是一个表达式的值。它可以使用字符值,比如:字符串,数字,布尔值,或则列表、某个字段。 > operator 可以为: > 常用的操作符:<,>,<=,>=,=,!=。 > "like"匹配一个"%value%"的字符串。"ilike"与此类似但不区分大小写。"not like"和"not ilike"也可以使用 > "child_of","parent_of"在层级关系中,筛选子集 > "in"和"not in"筛选是否在一个列表里面,所以,给的值应该是个list。当在"to-many"的关系字段中,"in"的作用和contains的作用一样 示例: ```json [ "&", [ "message_follower_ids", "in", [ "1", "2", "3" ] ], "|", [ "user_id", "=", "1000" ], [ "user_id", "=", false ] ] ``` #### 3. Filter的操作符 比较运算符:条件的操作符主要有如下类型 | 操作符 | 说明 | | :------------- | :----------------------------------------------------------- | | =,!=,>,>=,<,<= | 比较运算,等于,不等于,大于,大于等于,小于,小于等于 | | like | 模糊匹配,可以使用通配符,,百分号“%”匹配零或者多个字符 | | ilike | 类似like,不区分大小写 | | not like | 模糊不匹配的 | | in | 包含,判断值是否在元素的列表里面 | | not in | 不包含,判断值是否不在元素的列表里面 | | child_of | 判断是否value的子记录 | | parent_of | 用于有 父子关系的模型,13版本开始使用。 在旧版本使用 parent_left, parent_right | | | | 逻辑运算符,主要用于多个条件处理,逻辑运算符链接。逻辑运算符作为前缀放置于条件前面。: "|”(or) "&" (and) "!"(no)“ 默认逻辑运算符为“&” #### 4. Filter使用的算法是波兰表达式 计算的核心思想:运算波兰表达式时,无需记住运算的层次,只需要直接寻找第一个运算的操作符。以二元运算为例,从左至右读入表达式, 遇到一个操作符后跟随两个操作数时,则计算之,然后将结果作为操作数替换这个操作符和两个操作数;重复此步骤,直至所有操作符处理完毕。 简单来说,波兰表示法是一种操作符置于操作数前,并且不需要括号仍然能无歧义地解析表达的方法。 举例: ["|","&","|",a,b,c,"&",d,e] 其中a,b,c,e,f,g分别是不带逻辑运算符的表达式,表达式的运算顺序: ["|","&","|",a,b,c,"&",d,e] ["|","&",[a| b],c,"&",d,e] ["|",[[a | b] & c],"&",d,e] ["|",[[a |b] & c],[d& e]] [[[[a| b] |c]| [d & e]]] 逻辑运算符包括 符号说明 丨[or]或,二元运算 &[and]与,二元运算 ![no]非,单目运算 逻辑运算符默认是"与","与"运算符可以不写。 实例 “名字为 ABC”,就是一个最简单的单条件Domain。 [["name","=","ABC"]] “名字为 ABC 而且 语言编码不为en_US”,Domain里条件默认逻辑关系就是and,所以如下。 [["name","=","ABC"], ["language.code","!=","en_US"]] “名字为 ABC 而且语言编码不为 en_US 而且国家的编码为 be 或者 de”。 [["name","=","ABC"], ["language.code","!=","en_US"], "|",["country_id.code","=","be"], ["country_id.code","=","de"]] 如果我们要做到这个效果 A and (B or C)and D and E 先从里面开始,把or提前 A and (orB C) and D and E 把里面的and提前,去掉括号 and A or B C and D E 所以最后的filter可以这样写 A,"|", B,C,D,E 当然了,我们为什么不写得让自己也容易看一点呢,如下: A,D,E,"|", B,C
Uploading file...
Sidebar
[[_TOC_]]
Edit message:
Cancel