此包的最新版本(dev-master)没有可用的许可证信息。

一个Eloquent特性,提供pmql范围以允许将简单的SQL条件子句转换为Eloquent。

dev-master 2020-05-01 18:28 UTC

This package is auto-updated.

Last update: 2024-09-26 21:15:58 UTC


README

ProcessMaker查询语言

支持简单的类似SQL的表达式并转换为Laravel Eloquent。公开了一个Eloquent范围'pmql'来传递子句。

目录

简单用法

$results = Record::where('id', '<', 500)->pmql('username = "foobar" AND age < 25')->get();

运算符

比较运算符

逻辑运算符

大小写敏感

注意,PMQL语法不区分大小写。然而,查询是区分大小写的。例如,如果查询字符串,PMQL仅返回与查询完全匹配的大小写结果。这可以通过使用lower(field)语法来绕过。下面提供了示例。

类型转换

可以使用cast(field as type)语法将字段转换为各种数据类型。目前支持的类型有textnumber。下面提供了示例。

日期

"YYYY-MM-DD"格式输入的字符串被解释为日期,并可用于比较查询。日期可以根据当前时间动态比较,利用now关键字。可以使用date (+ or -)number interval语法在日期上执行算术运算。间隔可以是dayhourminutesecond。下面提供了示例。

语法示例

样本数据集

假设我们正在管理一支篮球队的名单。

基本语法

查找具有特定姓氏的球员。

查询

last_name = "Young"

结果

查找具有特定姓氏且在特定位置的球员。

查询

last_name = "Young" and position = "forward"

结果

查找在不同位置的球员。

查询

position = "center" or position = "forward"

结果

分组

查找符合分组条件的球员

查询

(position = "center" or position = "forward") and starter = "true"

结果

数字比较

根据经验年数查找球员。

查询

experience > 8

结果

转换为数字

如果我们想比较的字段以字符串形式存储而不是整数,会发生什么?没问题。我们可以简单地将它转换为数字。

假设我们的数据集已更改,将experience字段存储为字符串,但我们想找到所有有2年或以下经验的球员。

查询

cast(experience as number) <= 2

结果

日期比较

查找出生于1990年之前的球员。

查询

dob < "1990-01-01"

结果

动态日期比较

查找现在25岁以下的球员。我们利用now关键字并减去9,125天(365 * 25 = 9,125)。

查询

dob > now -9125 day

结果

模式匹配

我们可以使用LIKE运算符对字段执行模式匹配。%是一个通配符,它可以匹配零个、一个或多个字符。_是一个通配符,它可以匹配一个字符。

字符串开头

让我们找到所有姓氏以P开头的球员。

查询
last_name like "P%"
结果

精确模式

让我们找到所有姓氏以P开头,之后有三个字母的球员。

查询
last_name like "P___"
结果

字符串结尾

让我们找到所有姓氏以"son"结尾的球员。

查询
last_name like "%son"
结果

字符串包含

让我们找到所有名字中包含"am"的球员。

查询
first_name like "%am%" or last_name like "%am%"
结果

忽略大小写

让我们找到所有名字中包含"de"的球员,无论大小写。

查询
lower(first_name) like "%de%" or lower(last_name) like "%de%"
结果

自定义回调

您可以在pmql调用中利用自定义回调来覆盖特定表达式的行为

$results = Record::where('id', '<', 500)->pmql('username = "FOOBAR" AND age < 25', function($expression) {
    // This example will ensure checking for lowercase usernames as thats how it stored in our database
    if($expression->field->field() == 'username') {
        // If you want to modify the query, you need to return an anonymous function that will add your additional criteria
        return function($query) use($expression) {
                $query->where(DB::raw('LOWER(username)', $expression->operator, strtolower($expression->value->value()));
        }
    }
    // Let default behavior win for non username fields
    return false;
})->get();