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

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

安装次数: 49,944

依赖者: 0

建议者: 0

安全性: 0

星标: 9

关注者: 26

分支: 10

开放问题: 8

类型:项目


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"

结果

IN

类似于多个OR运算符,查找姓氏为Colson或Young的球员

查询

last_name IN ["Colson", "Young"]

结果

NOT IN

列出所有不具有姓氏Colson或Young的球员

查询

last_name NOT IN ["Colson", "Young"]

结果

分组

查找符合分组条件的球员

查询

(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();