是否支持不同字段的or
Cole-Mu opened this issue · 17 comments
Cole-Mu commented
例子里是一个字段的or ,但有时需要 (name='xxx' or id=1 ) and status=‘normal’ 这种sql,是否支持呢
TommyLemon commented
支持,见这个 issue
#84
TommyLemon commented
@wang1784594241 你的评论怎么不见了?我在通知里还看到这个:
"这个我看了啊,只找到这个 "id{}":"<=80000,>90000" 单字段 可是这也不能举一反三就知道怎么写多字段or啊"
TommyLemon commented
像上面那个例子,不考虑 id 为主键的话,可以
{
"Table": { //具体的表名
"name": "xxx",
"id": 1,
"status": "normal",
"@combine": "name | id" //或者 "|name,|id",或者 "|name,|id,&status",其中 | 可省略
}
}
如果 id 是主键,那就不允许和别的字段 OR 了,防止绕过自动化权限控制。
再说这种需求几乎没有,一般都是多条件搜索才会用到不同字段的 OR,
例如通用文档例子里的「搜索name或tag任何一个字段包含字符a的User列表」:
{
"User[]": { //查询一个数组,并提取里面的 User
"User": {
"name~": "a", //名称中包含 a
"tag~": "a", //标签中包含 a
"@combine": "name~ | tag~" //两个条件 OR 连接
}
}
}
还可以加上性别为女这个条件:
{
"User[]": { //查询一个数组,并提取里面的 User
"User": {
"sex": 1, //性别为女
"name~": "a", //名称中包含 a
"tag~": "a", //标签中包含 a
"@combine": "name~ | tag~" //两个条件 OR 连接
}
}
}
可以加上性能分析关键词 @explain
:
{
"User[]": { //查询一个数组,并提取里面的 User
"User": {
"sex": 1, //性别为女
"name~": "a", //名称中包含 a
"tag~": "a", //标签中包含 a
"@combine": "name~ | tag~" //两个条件 OR 连接
}
},
"@explain": true
}
就能直接在 Response 里看到 APIJSON ORM 自动生成的 SQL 语句是:
MySQL( "@database": "MYSQL" ):
SELECT * FROM `sys`.`apijson_user` WHERE ( (`sex` = 1) ) AND ( (`name` REGEXP BINARY 'a') OR (`tag` REGEXP BINARY 'a') ) LIMIT 10 OFFSET 0
PostgreSQL( "@database": "POSTGRESQL" ):
SELECT * FROM "sys"."apijson_user" WHERE ( ("sex" = 1) ) AND ( ("name" ~ 'a') OR ("tag" ~ 'a') ) LIMIT 10 OFFSET 0
Cole-Mu commented
感谢,原来文档里也有,只是没这么详细,之前没看明白,这下理解了。
zhangchunlin commented
我在 uliweb-apijson里不支持 @combine ,而是另外支持 @expr 这样一个更灵活的格式,可以支持比较复杂的表达,供参考,例子:
"user":{
"@column":"id,username,nickname,email",
"@order":"id-",
"@role":"ADMIN",
"@expr":[["username$","|","email$"],"&",["!","nickname$"]],
"username$":"%b%",
"email$":"%@example.com",
"nickname$":"%c%",
}
TommyLemon commented