arm092/new-dialect

为 Eloquent ORM 提供 JSON 数据类型支持

1.1.0 2021-08-18 17:40 UTC

This package is auto-updated.

Last update: 2024-09-21 18:54:53 UTC


README

Build Status Code Coverage Test Coverage

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