Tencent/APIJSON

是否支持不同字段的or

Cole-Mu opened this issue · 17 comments

例子里是一个字段的or ,但有时需要 (name='xxx' or id=1 ) and status=‘normal’ 这种sql,是否支持呢

支持,见这个 issue
#84

@wang1784594241 你的评论怎么不见了?我在通知里还看到这个:
"这个我看了啊,只找到这个 "id{}":"<=80000,>90000" 单字段 可是这也不能举一反三就知道怎么写多字段or啊"

像上面那个例子,不考虑 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

感谢,原来文档里也有,只是没这么详细,之前没看明白,这下理解了。

我在 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%",
}

我在 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%",
}

可以加个链接方便打开项目查看