processmaker / pmql
一个Eloquent特性,提供pmql作用域以允许将简单的SQL条件子句转换为Eloquent
Requires
- laravel/framework: ^5.7|^6|^7|^8|^9|^10
Requires (Dev)
- orchestra/testbench: ^4.8.0
- phpunit/phpunit: ^8.3
- dev-develop
- 1.12.1
- 1.12.0
- 1.11.0
- 1.10.0
- 1.9.2
- 1.9.1
- 1.9.0
- 1.8.0
- 1.7.0
- 1.6.1
- 1.6.0
- 1.5.1
- 1.5.0
- 1.4.0
- 1.3.0
- 1.2.0
- 1.2.0-RC1
- 1.1.5
- 1.1.4
- 1.1.3
- 1.1.2
- 1.1.1
- 1.1.0
- 1.0.1
- dev-main
- dev-next
- dev-bug/FOUR-12716
- dev-feature/FOUR-9714
- dev-bugfix/FOUR-8709
- dev-feature/FOUR-6473
- dev-feature/FOUR-8051
- dev-bugfix/FOUR-6782
- dev-feature/FOUR-6565
- dev-feature/FOUR-6588
- dev-FOUR-6127
- dev-laravel-9-support
- dev-4.1-develop
- dev-bugfix/FOUR-4970_4.2
- dev-bugfix/FOUR-4970
- dev-bugfix/ticket-1135
- dev-bugfix/ticket-1181
- dev-feature/FOUR-3078
- dev-v1.2.0-RC1
- dev-bugfix/FOUR-2516
- dev-laravel-upgrade
- dev-add-not-equal-test
- dev-feature/11
- dev-feature/6
- dev-feature/3
This package is auto-updated.
Last update: 2024-09-08 05:17:23 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"
结果
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();