laxity7/yii2-json-field

在模型中保存数据之前将数组转换为JSON的行为,并在保存和检索数据后也将JSON转换为数组

v1.0.2 2023-08-31 22:50 UTC

This package is auto-updated.

Last update: 2024-08-30 01:11:40 UTC


README

License Latest Stable Version Total Downloads

此行为为Yii2活动记录模型中处理JSON数据提供了高级支持。行为在模型中保存数据之前将数组转换为JSON,并在保存和检索数据后也将JSON转换为数组。可以使用数组或对象作为正常字段使用JSON字段。

安装

通过composer安装

composer require laxity7/yii2-json-field

如何使用

要使用JsonFieldBehavior,将以下代码插入到您的ActiveRecord类中

/** @inheritdoc */
public function behaviors(): array
{
   return [
       [
           'class'  => \laxity7\yii2\behaviors\JsonFieldBehavior::class,
           'fields' => ['foo_data', 'bar_data'],
       ],
   ];
}

您还可以传递以下参数

  • jsonOptions int (默认为 JSON_UNESCAPED_UNICODE) JSON常量可以组合形成json_encode()的选项。
  • defaultValue array|string (默认为 '[]') 属性的默认值。如果字段值为空,则默认值将存储在数据库中。如果[[skipEmpty]]被启用,则忽略。
  • skipEmpty bool (默认为 true) 是否跳过空字段。当为TRUE时,数据库中的字段可以是null,当为FALSE时将保存空对象('[]'或查看defaultValue)
  • asArray bool (默认为 true) 解码JSON为数组或对象。

因此,完整的设置列表将如下所示

use laxity7\yii2\behaviors\JsonFieldBehavior;
use yii\db\ActiveRecord;

/**
* @property int $id
* @property array $foo_data
* @property array $bar_data
 */
class Foo extends ActiveRecord {
    /** @inheritdoc */
    public function behaviors(): array
    {
        return [
            [
                'class'        => JsonFieldBehavior::class,
                'fields'       => ['foo_data', 'bar_data'],
                'jsonOptions'  => JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE,
                'skipEmpty'    => false,
                'defaultValue' => ['foo' => 'bar'],
                'asArray'      => true,
            ],
        ];
    }
    
    // Based on these parameters may be approximately the code
    public function updateBar(int $id, array $barData): array
    {
        $model = self::findOne(['id' => $id]);
        $model->foo_data['foo'] = 'bar1';
        $model->bar_data['bar'] = array_merge($model->bar_data['bar'], $barData);
        $model->save();
    
        return $model->bar_data['bar'];
    }
}