arm092 / new-dialect
为 Eloquent ORM 提供 JSON 数据类型支持
Requires
- php: >=5.4.0
- illuminate/support: 4.*|5.*|6.*|7.*
Requires (Dev)
- codeclimate/php-test-reporter: dev-master
- illuminate/database: 4.*|5.*|6.*|7.*
- phpunit/phpunit: 4.*
README
Dialect 为 Eloquent ORM 提供了 JSON 数据类型支持。目前这个实现非常基础,并且已经证明可以与 PostgreSQL 和 MySQL 一起工作。有很多机会进行增强和改进。如果您有兴趣贡献,请提交合并/拉取请求。
安装
composer require arm092/dialect
用法
基础知识
此功能通过一个名为的特质暴露,允许您在模型上定义 JSON 数据类型的属性。当模型被读取时,它将解析 JSON 文档并为每个顶级属性设置获取器和设置器,这使得与文档中的各种属性进行交互变得容易。例如,我们可以创建一个 Photos 模型如下所示
class Photo extends Eloquent { use Eloquent\Dialect\Json; protected $jsonColumns = ['json_data']; }
然后这
$attr = json_decode($photo->json_data); $attr->key = $value; $photo->json_data = json_encode($attr);
变为这样
$photo->key = value;
此外,在调用 toArray() 方法时,属性会被移动到顶级,并且 'json_attributes' 列会被隐藏。这实际上隐藏了您正在使用 JSON 数据类型的事实,并使其看起来像我们正在直接处理属性。
关系
您也可以在模型上建立类似的关系(仅在 PostgreSQL 中受支持)
public function user() { return $this->hasOne( 'User', 'id', "json_data->>'user_id'" ); }
结构提示
有时您可能有一个空或部分填充的记录,在这种情况下,特质无法自动检测并创建获取器和设置器等。在获取或设置 JSON 文档中之前未设置的属性时,您将得到一个异常。您有两个选择来处理这个问题。您可以在下面的示例中给出完整的结构提示
class Photo extends Eloquent { use Eloquent\Dialect\Json; protected $jsonColumns = ['json_data']; public function boot() { parent::boot(); $this->hintJsonStructure( 'json_data', '{"foo":null}' ); } }
一旦创建了一个提示,您将能够调用获取和设置 JSON 属性的调用,例如 $photo->foo = 'bar';,无论它们是否已在底层数据库记录中定义。或者,如果您更喜欢不提示结构,则可以调用 setJsonAttribute()。例如,如果您定义了一个名为 "json_data" 的 JSON 列,并想设置一个名为 'fizz' 的属性,则可以调用
$photo->setJsonAttribute( 'json_data', 'fizz', 'buzz' );
显示/隐藏属性
本项目的一个目标是将 JSON 属性作为模型的“一等公民”。这意味着默认情况下,我们将属性添加到模型的 appends 数组中,因此当您调用 $model->toArray() 或 $model->toJson() 时,该属性将作为结构的一部分显示,就像一个正常的属性一样。默认情况下,我们还将隐藏包含底层数据的 JSON 列。这两个设置都可以使用 showJsonColumns() 和 showJsonAttributes() 来更改,如下所示
class Photo extends Eloquent { use Eloquent\Dialect\Json; protected $jsonColumns = ['json_data']; public function boot() { parent::boot(); $this->showJsonColumns(true); $this->showJsonAttributes(false); } }