phptek / jsontext
JSON 存储、查询和修改。
Requires
- php: >=5.6.0
- peekmo/jsonpath: dev-master
- silverstripe/framework: ^4.0
Requires (Dev)
- phpunit/phpunit: ^5.7
Suggests
- silverstripe/cms: Use silverstripe/cms package if you want to write to JSON-backed DB fields via the CMS module's UI
Replaces
README
提供了一个完整的 API,允许开发者在特定的 DBField
子类中写入和查询 JSON。
此外,如果您的项目使用 silverstripe/cms
包,则所有 SiteTree
对象将自动扩展,允许使用在 getCMSFields()
中声明的多个任意 UI 字段,以写入单个数据库字段中的 JSON 对象。
使用 JSONPath(类似于 XPath 但用于 JSON)和模块的广泛 API,开发人员可以选择性地针对特定的 JSON 键进行修改。
要求
SilverStripe 4
- 使用 ^2.0
- PHP >=5.6, <=7.1
SilverStripe 3
- 使用 ^1.0
- PHP >=5.4, <7.0
功能
- 在特定的
DBField
子类中存储 JSON "对象字符串"。 - 通过简单的访问器:
first()
、last()
和nth()
或类似于 Postgres 的运算符:->
、->>
和#>
或甚至 JSONPath 表达式查询存储的 JSON。 - 选择性地以
JSON
、Array
或转换为 SilverStripe 的DBVarchar
、DBInt
、DBFloat
或DBBoolean
对象返回查询结果。 - 使用 JSONPath 表达式选择性地更新存储的 JSON 的部分。
- 选择性地转换一个或多个 CMS 输入字段,以写入单个 JSON 存储。
简介
该模块公开了一个完整的 JSON 查询和更新 API,允许开发人员通过 JSONPath 或 Postgres 的 JSON 运算符(有一些差异,见下文)使用类似 XPath 的查询来查询和更新 JSON 数据。
为什么?
在项目场景中,将 10 多个简短的配置参数作为布尔值和整数存储在单独的数据库列中似乎很疯狂。
当你只是想有一个简单的键 / 值存储,但又不希望处理 RDBMS 和 NOSQL 数据库的冗余。
Postgres、MySQL、Oracle 和 MSSQL 2016 都有,或正在计划在编写时拥有数据库级别的 JSON 字段类型。此模块填补了没有本地 JSON 支持的 RDBMS 用户之间的空白,同时提供了一个方便的框架,可以在其之上构建本地 JSON 支持。
Postgres
在 Postgres 中,->
和 ->>
运算符分别作为 JSON 数组或 JSON 对象上的字符串和整数键匹配器。然而,该模块将两种源类型视为相同 - 因为它们都是 JSON,所以 ->
被用作 整数匹配器,而 ->>
被用作 字符串匹配器,无论 存储的 JSON 的“类型”如何。《#> 路径匹配器 运算符可以作为对象或文本匹配器,但模块希望简化事情,因此 #>
运算符只是 简单的路径匹配器。
返回类型
无论您进行什么类型的查询,您都可以通过每个查询的 setReturnType()
方法设置您希望数据以什么类型返回。
有效类型是
- JSON
- 数组
- SilverStripe
如果使用 SilverStripe
作为返回类型,模块将自动将结果(或多个结果)转换为 SilverStripe 的 DBObject
子类型之一
DBBoolean
DBInt
DBFloat
DBVarchar
如果查询结果有多个,输出将是一个索引数组,其中包含每个找到的结果的单值数组。
该模块还允许开发者通过传递给重载的 setValue()
方法的 JSONPath 表达式来选择性更新所有或部分源 JSON。
请参阅 使用文档 以获取 JSONPath 和 Postgres 查询及更新的示例。
注意:此模块的查询 API 基于 JSON 到数组转换的相对简单原则。它不使用 Postgres 或 MySQL 的原生 JSON 操作符,也不在 ORM 层级以下使用。然而,目标是为了允许开发者使用他们首选数据库的语法,为此,您可以使用 SS 配置将模块设置为 mysql
或 postgres
模式,请参阅 配置文档。
安装
#> composer require phptek/jsontext
配置
请参阅: 配置文档。
使用
请参阅: 使用文档。
贡献
如果您已经使用了一段时间的 Postgres 或 MySQL 以及其 JSON 函数,我非常愿意听取您的意见。一些简单的失败测试将非常受欢迎。
请参阅: CONTRIBUTING.md。
报告问题
请包含所有详细信息,无论大小。如果它是 您的模块,您需要从错误/功能请求中了解什么?:-)
鸣谢
- Axel Anceau,他为 Stefan Goessner 的出色 JSONPath 实现打包
- Stefan Goessner,自 2005 年以来对 JSONPath 的原始工作!
作者
Russell Michell 2016-2018 russ@theruss.com
待办事项
- 将缺少的
prepValueForDB()
添加到JSONText
类中。 - 请参阅 GitHub 上的官方问题列表。
支持我
如果您喜欢您所看到的,请支持我!我接受比特币