testprocessmaker / pmql
一个Eloquent特性,提供pmql范围以允许将简单的SQL条件子句转换为Eloquent。
Requires
- laravel/framework: ~5.7.0|~5.8.0
Requires (Dev)
- orchestra/testbench: ^3.5
- phpunit/phpunit: ^7.0
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)
语法将字段转换为各种数据类型。目前支持的类型有text和number。下面提供了示例。
日期
以"YYYY-MM-DD"
格式输入的字符串被解释为日期,并可用于比较查询。日期可以根据当前时间动态比较,利用now
关键字。可以使用date (+ or -)number interval
语法在日期上执行算术运算。间隔可以是day
、hour
、minute
或second
。下面提供了示例。
语法示例
样本数据集
假设我们正在管理一支篮球队的名单。
基本语法
查找具有特定姓氏的球员。
查询
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();