Skip to content

JSON格式字段处理

laravel-admin的表单提供了下面几个组件来处理JSON格式的字段,方便用来处理JOSN格式的对象、一维数组、二维数组等对象。

在使用下面的组件之前,必须先在模型中设置该字段的格式转换

php
class Foo extends Model
{
    protected $casts = [
        'column_name' => 'json',
    ];
}

键值对象

QQ20200519-125825

如果你的字段存储的是不固定{"field":"value"}格式,可以用keyValue组件:

php
$form->keyValue('column_name');

// 设置校验规则
$form->keyValue('column_name')->rules('required|min:5');

固定键值对象

QQ20200519-130014

用于处理mysqlJSON类型字段数据或者mongodbobject类型数据,也可以将多个field的数据值以JSON字符串的形式存储在mysql的字符串类型字段中

适用于有固定键值的JSON类型字段

php
$form->embeds('column_name', function ($form) {

    $form->text('key1')->rules('required');
    $form->email('key2')->rules('required');
    $form->datetime('key3');

    $form->dateRange('key4', 'key5', '范围')->rules('required');
});

// 自定义标题
$form->embeds('column_name', '字段标题', function ($form) {
    ...
});

回调函数里面构建表单元素的方法调用和外面是一样的。

一维数组

QQ20200519-125926

如果你的字段是用来存储["foo", "Bar"]格式的一维数组, 可以使用list组件:

php
$form->list('column_name');

// 设置校验规则
$form->list('column_name')->rules('required|min:5');

// 设置最大和最小元素个数
$form->list('column_name')->max(10)->min(5);

二维数组

WX20190505-124413

如果某一个字段存储的是json格式的二维数组,可以使用table表单组件来实现快速的编辑:

php
$form->table('column_name', function ($table) {
    $table->text('key');
    $table->text('value');
    $table->text('desc');
});

同时需要在模型里面给这个字段设置访问器和修改器:

php
    public function getColumnNameAttribute($value)
    {
        return array_values(json_decode($value, true) ?: []);
    }

    public function setColumnNameAttribute($value)
    {
        $this->attributes['column_name'] = json_encode(array_values($value));
    }

这个组件类似于hasMany组件,不过是用来处理单个字段的情况,适用于简单的二维数据。